以下代码创建一个数组和一个字符串对象.
现在我的问题是
这是我的代码
String[] students = new String[10];
String studentName = "Peter Smith";
students[0] = studentName;
studentName = null;
Run Code Online (Sandbox Code Playgroud)
我认为答案只是一个对象,students
但根据Oracle文档,Neither object is eligible for garbage collection
我应该如何推断答案?
The*_*kis 10
代码执行后,对这些对象有多少引用?
String[],可通过表达式获得students.String,可通过表达式获得students[0].为什么?
从本质上讲,答案是对象而不是变量可以有资格进行垃圾回收.
在您的情况下,您已将字符串(它是一个对象)的引用复制到数组的第一个插槽中.即使在您清除(设置为null)初始变量之后,仍然可以从您的代码中看到相同的对象,通过其他名称(以及"名称",这里我的意思是"表达式",如上所述).这就是字符串仍然不符合垃圾回收的原因.
为了比较,请考虑没有第三行的代码:
String[] students = new String[10];
String studentName = "Peter Smith";
studentName = null;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,字符串"Peter Smith"确实可以按照您的预期进行垃圾收集,因为任何表达式都无法获取它.
(以上所有内容都涉及Java语言,并且不考虑任何可能的JVM优化.)