Подскажите пож-ста, почему модификатор 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
При создании экземпляра класса String путем присваивания его ссылки на литерал, последний помещается в так называемый «пул литералов». Если в дальнейшем будет создана еще одна ссылка на литерал, эквивалентный ранее объявленному, то будет произведена попытка добавления его в «пул литералов». Так как идентичный литерал там уже существует, то дубликат не может быть размещен, и вторая ссылка будет на существующий литерал. Аналогично в случае, если литерал является вычисляемым. То есть компилятор воспринимает литералы "socialmedia" и "social" + "media" как эквивалентные. В данном случае слияние финализированных строк в String str31 = str11 + str21; это то же самое что и String str31 = "social" + "media". В итоге str31 будет ссылатся на ту же самую область «пула литералов» что и String str4 = "socialmedia";
А т.к. String str3 = str1 + str2; (слияние нефинализированных ссылок) то эта переменная уже не попадет в «пул литералов» и сравнение ссылок приведет к false.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Выдает: ClassNotFoundException, если запускать через cmdexe, хотя если через Eclipse все норм
Сможет ли сборщик мусора в java 11 очистить объекты, имеющие ссылку друг на друга?
Создал файл резервной копии mydb1 с помощью команды mysqldump: