Разница между + и + = на Java строках - PullRequest
3 голосов
/ 03 августа 2020

Я хотел бы понять, как распределяется память, когда мы используем + и + = для строк в Java. Я знаю, что строковые литералы хранятся в пуле строковых констант, а в случае 1 и s1, и s2 ссылаются на одну и ту же память в пуле констант строк.

В случае № 2, даже если я использую оператор +, он по-прежнему ссылается на тот же объект в String Constant Pool

Что мне интересно, так это Случай №3. Как и где в этом случае выделяется память? Чем он отличается от Case # 2

//Case #1
String s1 = "Hello Java";
String s2 = "Hello Java";
System.out.println(s1 == s2); //true

//Case #2
s1 = "Hello" + " Java";
s2 = "Hello Java";
System.out.println(s1 == s2); //true

s1 = "Hello";
s1 += " Java";
s2 = "Hello Java";
System.out.println(s1 == s2); //false

1 Ответ

14 голосов
/ 03 августа 2020

На самом деле это не разница между + и +=; вы получите то же поведение, что и в случае № 3, если вы напишете:

s1 = "Hello";
s1 = s1 + " Java";
s2 = "Hello Java";
System.out.println(s1 == s2); //false

Причина поведения, которое вы видите в случае № 2, заключается в том, что "Hello" + " Java" является постоянным выражением [ JLS8 §15.28 ], поэтому его можно обрабатывать во время компиляции точно так же, как если бы это было "Hello Java", и требуется интернировать, как и "Hello Java".

Когда вы разбиваете его на отдельные операторы, это уже не так, поэтому вы получаете вновь созданную строку [ JLS8 §15.18.1 ].

...