Цитирование этой страницы:
Сколько объектов будет иметь право на GC здесь?
String s = "hello"; Character ch1 = 1; Character ch2 = 1; ch1 = null; s = null;
Я считаю, что ответ 1.
Я хотел бы понять, как это работает в Java 6.
Мое понимание на данный момент:
Строка идет в бассейн. Позже о нем не упоминается. Итак, согласно этому ответу (я не понимаю эту часть насчет загрузчика классов, можете пояснить?), пул строк скорее всего не будет собираться мусором...
Хорошо, Персонажи. В Java существует эта оптимизация, которая приведет к тому, что ch1
и ch2
будут указывать на один и тот же объект. Итак, эти маленькие Персонажи тоже собираются в какой-то бассейн. Но, несмотря на то, что ch1
является null
, мы по-прежнему можем получить доступ к 1
по ссылке ch2
.
Итак, мой ответ на данный момент будет 0.
Прав ли я на каждом шагу? Если нет, поправьте меня. Не могли бы вы объяснить, как именно это работает?
ch2 = null;
. Они хотели указать, что пулCharacter
не обязательно поддерживает объект в рабочем состоянии (в отличие от пулаString
), но сохранение ссылки на него вch2
привело к уничтожению этой точки. Однако, как деталь реализации, пул эталонной реализации действительно поддерживает объектыCharacter
с помощью переменнойstatic
. Дело закрыто… или… нет? - person Holger   schedule 08.06.2020String
представляет собой оболочку вокруг объекта массива, другими словами, состоит из двух объектов. Таким образом, формально правильным ответом будет 0, 1, 2 или 3 объекта, в зависимости от реализации; мы просто не знаем и не должны знать... - person Holger   schedule 08.06.2020