#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.
Комментариев нет:
Отправить комментарий