以下代码创建一个数组和一个字符串对象。代码执行后存在多少对这些对象的引用?任一对象是否有资格进行垃圾回收?

...
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;之前,studentNamestudents[0]都持有对相同String对象(其值为"Peter Parker")的引用。当您将null分配给studentName时,students[0]仍然引用该对象,因此无法对其进行垃圾回收。

Java不会垃圾收集引用变量,一旦不再有对它们的引用,它就会垃圾收集这些变量所引用的对象。

10-05 22:18