Как String pool управляет ссылками, если мы меняем строковое значение? - PullRequest
0 голосов
/ 01 февраля 2020

Если у нас есть строка s = "Hello", она создаст строку "Hello" в пуле строк, и некоторая ссылка будет указывать на строку s, что если я изменю s = "World". В пуле строк она создаст новую строку " Мир ", и теперь моя ссылка указывает на Мир. Что будет со строкой «Hello»?

Ответы [ 2 ]

1 голос
/ 01 февраля 2020

Из документации String:

... Строковые объекты являются неизменяемыми ...

String -константы известные во время компиляции также обрабатываются специально. Они хранятся в постоянном пуле. Все «равные» во время компиляции String -константные ссылки совпадают с String -объектом. По этой причине

String s1 = "Hello";
String s2 = "Hello";
System.out.println(s1 == s2);

напечатает true. Есть и другие интересные примеры. Я написал Идеальный пример некоторое время назад , который демонстрирует некоторые из этих интересных случаев.

Когда кто-то повторно присваивает значение некоторой переменной непримитивного типа s старый объект все еще существует в куче (пока сборщик мусора не считает его пригодным для сбора). Что изменилось, так это то, на что ссылается переменная s. В представленном случае вторая String -константа создается во время компиляции, а s затем ссылается на вторую константу.

0 голосов
/ 02 февраля 2020

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

На строковые литеральные объекты (такие как "Hello" и "World") будут ссылаться из Java Струнный пул (они интернированы). Поскольку это считается ссылкой, объект «Hello» не будет собираться после вашего переназначения. Это произойдет только в том случае, если сам код станет недоступным (например, если весь класс был загружен динамически, а его загрузчик классов стал недоступным).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...