Страницы

Поиск по вопросам

воскресенье, 15 декабря 2019 г.

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

#java #строки #final


Подскажите пож-ста, почему модификатор 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

    


Ответы

Ответ 1



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

Комментариев нет:

Отправить комментарий