Oracle Java教程 - 在回答问题时可能出现错误

Eli*_*luf 18 java

我是Java新手,阅读Oracle教程.在每个部分之后,有问题和答案,我不理解一个答案中的句子(见下面的粗体线).

来源是https://docs.oracle.com/javase/tutorial/java/javaOO/QandE/objects-answers.html

我指的是问题2,看到粗体字.据我所知,如果没有对数组的引用,则数组有资格进行垃圾回收.无关紧要,是否存在对此数组所持有的对象的引用,因为内部对象(在数组内)具有自己的引用计数.是对的吗?请解释粗体句.

从oracle教程中引用:https://docs.oracle.com/javase/tutorial/java/javaOO/QandE/objects-answers.html

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

    String[] students = new String[10];
    String studentName = "Peter Smith";
    students[0] = studentName;
    studentName = null;
    
    Run Code Online (Sandbox Code Playgroud)

    答:有一个对students数组的引用,该数组有一个对字符串Peter Smith的引用.这两个对象都没有资格进行垃圾回收.数组学生没有资格进行垃圾收集,因为它有一个对象studentName的引用,即使该对象已被赋值为null.该对象studentName不符合条件,因为 students[0]仍然引用它.

Max*_*mer 15

数组学生没有资格进行垃圾收集,因为它有一个对象studentName的引用,即使该对象已被赋值为null.

是的,那句话是......奇怪的.这没有道理.

无论对其他对象有什么引用,数组都可以进行垃圾收集.

students是对数组的引用,因此只要students保留在范围内,它就不符合垃圾回收的条件.

  • 我不知道@XtremeBaumer是怎么回事 (3认同)

dav*_*xxx 14

这两个对象都没有资格进行垃圾回收.

这是正确的.

但解释不清楚:

array学生不符合垃圾收集,因为它有一个参考对象studentName,即使该对象已被分配的值null.

studentName不是一个对象,它是一个变量.
此外,null阵列中的元素不会影响GC的阵列合格性,但它只具有数组元素的GC合格性.

例如 :

String[] students = new String[10];
// the object referenced by students is not eligible to be GC
Run Code Online (Sandbox Code Playgroud)

要么 :

String[] students = new String[10];
String studentName = "Peter Smith";
students[0] = studentName;
students[0] = null;
// no object is eligible to be GC 
Run Code Online (Sandbox Code Playgroud)

一个正确的句子可能是:

String对象不符合垃圾收集的条件,因为该studentName变量先前引用的对象仍然被数组引用,并且将新对象分配studentName给变量(如分配给null)仅更改此变量的引用,而不更改引用该变量的引用.同一个对象.


请注意,数组不会像Java使用对象分配那样改变任何方式.
有了List你可以看到相同的行为.
例如 :

String a = "Peter";
List<String> list = ...
list.add(a);
a = null;
Run Code Online (Sandbox Code Playgroud)

出于同样的原因,没有对象有资格成为GC.