Сравнение строк c модификатором final

117
30 сентября 2021, 06:40

Подскажите пож-ста, почему модификатор final меняет результат сравнения?

String str4 = "socialmedia";
String str1 = "social";
String str2 = "media";
String str3 = str1 + str2;
System.out.println(str3 == str4); // false
final String str11 = "social";
final String str21 = "media";
String str31 = str11 + str21;
System.out.println(str31 == str4); // true
Answer 1

При создании экземпляра класса String путем присваивания его ссылки на литерал, последний помещается в так называемый «пул литералов». Если в дальнейшем будет создана еще одна ссылка на литерал, эквивалентный ранее объявленному, то будет произведена попытка добавления его в «пул литералов». Так как идентичный литерал там уже существует, то дубликат не может быть размещен, и вторая ссылка будет на существующий литерал. Аналогично в случае, если литерал является вычисляемым. То есть компилятор воспринимает литералы "socialmedia" и "social" + "media" как эквивалентные. В данном случае слияние финализированных строк в String str31 = str11 + str21; это то же самое что и String str31 = "social" + "media". В итоге str31 будет ссылатся на ту же самую область «пула литералов» что и String str4 = "socialmedia";

А т.к. String str3 = str1 + str2; (слияние нефинализированных ссылок) то эта переменная уже не попадет в «пул литералов» и сравнение ссылок приведет к false.

READ ALSO
выдает ClassNotFoundException если запускать через cmd.exe

выдает ClassNotFoundException если запускать через cmd.exe

Выдает: ClassNotFoundException, если запускать через cmdexe, хотя если через Eclipse все норм

185
Происходит ли в Java утечка памяти при циклических ссылках?

Происходит ли в Java утечка памяти при циклических ссылках?

Сможет ли сборщик мусора в java 11 очистить объекты, имеющие ссылку друг на друга?

97
Laravel where и orWhere не работает

Laravel where и orWhere не работает

Мой запрос выглядит так

189
Почему не удается восстановить базу данных из файла резервной копии?

Почему не удается восстановить базу данных из файла резервной копии?

Создал файл резервной копии mydb1 с помощью команды mysqldump:

95