3

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


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

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

答案:有一个对学生数组的引用,并且该数组有一个对字符串 Peter Smith 的引用。两个对象都不符合垃圾回收条件。

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


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

4

3 回答 3

10

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

于 2013-02-07T17:07:26.620 回答
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引用设置为 null,但“Peter Smith”对象继续存在,并且数组仍然指向它。因此,对象永远不会为空,只有一个引用为空。

于 2013-05-08T12:55:04.427 回答
1

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

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

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

于 2013-05-14T10:26:00.227 回答