Как работает конкатенация строк в следующих - PullRequest
1 голос
/ 04 мая 2020

Согласно следующему Как Java Пул строк работает при объединении строк? разговор,

String a = "hello world!";
String b = "hello" + " world!";
boolean compare = (a == b);

Значение compare должно быть истинным, что является правильным. Однако у меня есть следующий код

String s1 = "This is";
String s2 = " a new String";
String s3 = s1 + s2;
String s4 = "This is a new String";

При сравнении System.out.printf("s3 == s4:%s\n", s3 == s4);//always false Всегда ложно. Насколько я понимаю, при объединении s1 и s2 s3 создаст строку в пуле, а когда будет создан s4, он будет указывать на то же местоположение пула. Но это не так. Я пробовал это с JDK 7,8 и 14, и результаты согласуются.

1 Ответ

3 голосов
/ 04 мая 2020

Вот как поведение в отношении пула строк определяется в спецификации языка Java (выделено мной):

3.10.5 Строковые литералы

[...]

Более того, строковый литерал всегда ссылается на один и тот же экземпляр класса String. Это связано с тем, что строковые литералы - или, в более общем случае, строки, являющиеся значениями константных выражений (§15.28), - "интернированы", чтобы обмениваться уникальными экземплярами, используя метод String.intern.

Объединяются только константные выражения типа String. "This is a new String" и "hello" + " world!" являются константными выражениями. Компилятор может оценить эти выражения во время компиляции. s1 + s2 не является константным выражением.

Поэтому при выполнении s1 + s2 создается новая строка . Но обратите внимание, что другая строка, которая так же имеет те же символы, что и новая строка, находится в пуле строк, потому что вы использовали строковый литерал для инициализации s4.

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