我一直在阅读Java网站上的Java教程,并且对他们给出的问题给出的答案感到困惑。
问题如下:"以下代码创建一个数组和一个字符串对象。代码执行后,对这些对象有多少引用?这两个对象是否有资格进行垃圾回收?"
String[] students = new String[10];
String studentName = "Peter Smith";
students[0] = studentName;
studentName = null;
答案:"有一个对students数组的引用,该数组有一个对字符串Peter Smith的引用。这两个对象都没有资格进行垃圾回收。"
为什么studentName
没有资格进行垃圾回收?没有任何内容指向studentName
,其值为null
。
答案 0 :(得分:4)
studentName是变量而不是对象 - 您只垃圾收集对象。
如上所述,这里唯一的对象是创建的String[]
和" Peter Smith",两者都可以访问,因此不能用于GC。
答案 1 :(得分:0)
studentName
是对Object
的引用,而不是实际的Object
,
如果您的意思是studentName
String studentName = "Peter Smith";
然后它仍被students[0]
students[0] = studentName;
答案 2 :(得分:-1)
如果您查看该网站上的文档,请在summary page中说明以下内容:
“垃圾收集器会自动清除未使用的对象。如果程序不再拥有对它的引用,则不使用该对象。您可以通过将保存引用的变量设置为null来显式删除引用。”
即使 studentName 在设置为null时发布了对“Peter Smith”的引用,但字符串数组 students 仍然具有对该对象的引用,因此它是没有资格进行垃圾收集。数组本身也仍然有引用它。如果你把它放在一个小程序中并运行它并在这个代码块后打印出学生[0]它将打印“Peter Smith”