以下代码创建一个数组和一个字符串对象。代码执行后,对这些对象有多少引用?这两个对象是否有资格进行垃圾收集?
...
String[] students = new String[10];
String studentName = "Peter Parker";
students[0] = studentName;
studentName = null;
...
我的回答是studentName有资格进行垃圾收集。但是给出的答案都不符合条件。我认为学生[0]是指String" Peter Parker"而studentName也是一样的。现在studentName引用null,学生[0]仍然指的是" Peter Parker" (我通过打印来检查这个。)给出的解释是学生[0]仍然指的是studentName所以studentName也没有资格进行垃圾收集。但是我不理解这个,因为studentName现在指的是null和学生[0]指的是彼得帕克"。我的理解错了吗?
答案 0 :(得分:6)
在studentName = null;
执行之前,studentName
和students[0]
都持有对同一String
对象(其值为"Peter Parker"
)的引用。当您将null
分配给studentName
时,students[0]
仍会引用该对象,因此无法对其进行垃圾回收。
Java没有垃圾收集引用变量,一旦没有对这些变量的引用,它就会收集这些变量所引用的对象。
答案 1 :(得分:3)
此处使用"Peter Parker"
和studentName
创建String对象
只是提到它。 Java将垃圾收集那些对象
迷路了,没有参考,这里你很困惑参考
studentName
。通过将null
分配给studentName
,您只需删除即可
"Peter Parker"
的一个参考;但它仍然由数组元素引用,
所以它不会被垃圾收集。
答案 2 :(得分:3)
您有两个对象:
"Peter Parker"
有三个引用:
studentName
正在引用字符串对象。students
正在引用数组对象。students[0]
也引用了字符串对象。执行此行后:
studentName = null;
仅删除了三个引用中的第一个。我们仍然有两个引用。
否,因为:
students
变量引用。"Peter parker"
仍由数组对象students[0]
的第一个位置引用。由于两个对象仍然在某处被引用,因此它们都不符合垃圾回收的条件。
PS:我使用过通用"字符串"和"阵列"有目的的对象的术语,因此更容易在心理上将它们与代码中的实际String和String []变量分离。