以下代码创建一个数组和一个字符串对象。代码执行后存在多少对这些对象的引用?任一对象是否有资格进行垃圾回收?
...
String[] students = new String[10];
String studentName = "Peter Parker";
students[0] = studentName;
studentName = null;
...
我的答案是 studentName 有资格进行垃圾收集。但给出的答案是两者都不符合条件。我认为 student[0] 指的是字符串“Peter Parker”,而 studentName 也是如此。现在 studentName 指的是 null,学生 [0] 仍然指的是“彼得帕克”(我通过打印出来检查了这一点)。给出的解释是学生 [0] 仍然指的是学生名,所以学生名也不符合垃圾收集的条件。但我不明白这是因为studentName现在指的是null,而student[0]指的是“Peter Parker”。我的理解有误吗?
最佳答案
在执行studentName = null;
之前,studentName
和students[0]
都持有对相同String
对象(其值为"Peter Parker"
)的引用。当您将null
分配给studentName
时,students[0]
仍然引用该对象,因此无法对其进行垃圾回收。
Java不会垃圾收集引用变量,一旦不再有对它们的引用,它就会垃圾收集这些变量所引用的对象。