Сколько объектов String будет создано в пуле строк Java? - PullRequest
2 голосов
/ 15 июня 2019
String hello = "Hello";
String world = " World!";
String bye = "Bye";
String greeting = hello + world;
String goodbye = bye + world;

Я знаю с первыми тремя, что в пуле Java String создан новый объект, но с последними двумя я не уверен.

Есть ли ссылки на объекты пула строк в переменных приветствия и до свидания, или созданы 2 новых объекта String?

Ответы [ 2 ]

3 голосов
/ 15 июня 2019

В вашем случае в String pool будет создано 3 объекта String.greeting и goodbye будут созданы в куче.

javac имеет оптимизацию для помещения greeting и goodbye в пул строк, если hello, word и bye являются окончательными, операция + будет выполняться во время компиляции вместовремя выполнения.
Два из приведенных ниже кодов будут скомпилированы в один и тот же байт-код.

final String hello = "Hello";
final String world = " World!";
final String bye = "Bye";
String greeting = hello + world;
String goodbye = bye + world;
final String hello = "Hello";
final String world = " World!";
final String bye = "Bye";
String greeting = "Hello World!";
String goodbye = "Bye World!";
3 голосов
/ 15 июня 2019

В вашем примере только первые 3 будут созданы в пуле строк, а последние два будут строковым объектом в куче.Причина в том, что когда вы объединяете строку с помощью оператора +, она проверяет, существует ли результирующая строка в пуле строк, затем она возвращает ссылку, в противном случае она создаст новый объект String, даже если строки, которые вы используете для создания новогоодин уже в бассейне.Вы можете проверить, что при выполнении следующих действий:

greeting == "Hello World!" 
goodbye == "Bye World!"

в обоих случаях будет возвращено значение false, что показывает, что их нет в пуле.

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