Учебник Oracle Java - возможная ошибка при ответе на вопрос

Я новичок в Java, читаю учебник Oracle. После каждого раздела есть вопросы и ответы, и я не понимаю предложения в течение одного ответа (см. Ниже выделенную строку).

Источник: https://docs.oracle.com/javase/tutorial/java/javaOO/QandE/objects-answers.html

Я имею в виду вопрос 2, см. Смелые слова. Насколько я понимаю, массив имеет право на сбор мусора, если нет ссылки на массив. Неважно, есть ли ссылка на объекты, хранящиеся в этом массиве, поскольку внутренние объекты (внутри массива) имеют свой собственный подсчет ссылок. Это правильно? Пожалуйста, объясните смелое предложение.

cite from oracle tutorial: 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;
    

    Ответ. Существует одна ссылка на массив студентов, и этот массив имеет одну ссылку на строку Peter Smith. Ни один объект не имеет права на сбор мусора. Студенты массива не имеют права на сбор мусора, поскольку имеют одну ссылку на объект studentName, хотя этому объекту было присвоено значение null. Объект studentName не подходит ни потому, что students[0] все еще ссылаются на него.

Ответ 1

Студенты массива не имеют права на сбор мусора, поскольку имеют одну ссылку на объект studentName, хотя этому объекту было присвоено значение null.

Да, это предложение... странно. Это не имеет никакого смысла.

Массив может иметь право на сбор мусора, независимо от того, какие ссылки он держит для других объектов.

students - это ссылка на массив, поэтому он не имеет права на сбор мусора, пока students остаются в сфере охвата.

Ответ 2

Ни один объект не имеет права на сбор мусора.

Это правильно.

Но объяснение неясно:

Студенты array не имеют права на сбор мусора, поскольку имеют одну ссылку на объект studentName хотя этому объекту было присвоено значение null.

studentName не является объектом, это переменная.
Кроме того, null элементы в массиве не будут влиять на приемлемость массива как GC, но он будет иметь только права GC на элементы массива.

Например:

String[] students = new String[10];
// the object referenced by students is not eligible to be GC

Или же:

String[] students = new String[10];
String studentName = "Peter Smith";
students[0] = studentName;
students[0] = null;
// no object is eligible to be GC 

Правильное предложение может быть:

Объект String не подходит для сбора мусора, поскольку объект, ранее ссылающийся на переменную studentName по-прежнему ссылается на массив и назначает новый объект переменной (при присвоении имени studentName на null) изменяет только ссылку на эту переменную, а не на переменные, которые ссылаются на один и тот же объект.


Обратите внимание, что массив ничего не меняет в способе работы Java с назначением объекта.
С помощью List вы можете заметить такое же поведение.
Например:

String a = "Peter";
List<String> list = ...
list.add(a);
a = null;

По той же причине ни один объект не может быть GC.

Ответ 3

Все это связано с тем, что Строки являются неизменяемыми, что означает, что после их создания они не могут быть изменены. Поэтому, когда вы это делаете,

String studentName = "Peter Smith";

и тогда вы это сделаете,

studentName = null,

Теперь имя studnentName указывает на другой адрес памяти, который указывает на null. "Питер Смит" все еще где-то в памяти.

После того, как значение "Peter Smith" присваивается ученику [0], ученик [0] все еще сохраняет это значение даже после того, как значение studentName было равно null. Поскольку ученик [0] содержит ссылку на место в памяти, которое содержит "Питер Смит".