Java - 为什么为变量赋值“null”并不能使它可用于GC? (在此代码段中)

时间:2013-02-07 17:05:52

标签: java variables null garbage-collection

我正在浏览oracle提供的在线教程。其中一个练习有一个问题如下:


  

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

...
String[] students = new String[10];
String studentName = "Peter Smith";
students[0] = studentName;
studentName = null;
...
     

答案:有一个对students数组的引用,该数组有一个对字符串Peter Smith的引用。这两个对象都没有资格进行垃圾回收。

http://docs.oracle.com/javase/tutorial/java/javaOO/QandE/objects-answers.html


当然最后一行意味着studentName有资格获得GC?真的很困惑,我认为这意味着我没有理解“null”的本质,也没有理解对象引用,这就是我要问的原因。

3 个答案:

答案 0 :(得分:10)

在将null分配给studentName之前,有两个对“Peter Smith”的引用(studentNamestudents[0])。将null分配给studentName后,{Peter}仍然会被students[0]

引用

答案 1 :(得分:1)

实际上,有哪些对象无法进行垃圾回收? “Peter Smith”和String [10]数组。注意这些是对象本身,而不是对象的引用!仅存在一个引用就足以避免垃圾回收了。

我使用的是一种在阅读代码时要详细的精神技巧。当你的意思是“字符串对象”(字符串中的单词)或“字符串引用”(指向单词的变量)时,很容易说“字符串”(模糊),所以这个技巧避免了这种混淆。

用我的心理技巧重写伪代码,将所有内容标记为对象或引用我在脑海中的方式:

1 String[] OBJECT student REFERENCE = new String[10] OBJECT;
2 String OBJECT studentName REFERENCE = "Peter Smith" OBJECT;
3 students[0] REFERENCE = studentName REFERENCE;
4 studentName REFERENCE = null;

在第3行中,String [0] _ 引用指向“Peter Smith”对象。现在很清楚,只有studentName 引用< / em>设置为null但“Peter Smith”对象仍然存在,并且数组仍然指向它。因此,对象不会为空,只有一个引用被清空。

答案 2 :(得分:1)

这个页面很好地解释了基本的java引用概念(以及它们本质上只是指针)

http://javadude.com/articles/passbyvalue.htm

虽然不是关于这个问题,但它是直接相关的。对象由java中的指针(引用)引用。理解这应该有很多帮助。