String s = "hello";
String backup_of_s = s;
s = "bye";
На даний момент змінна резервного копіювання все ще містить вихідне значення "привіт" (це через незмінність права String?).
Але чи справді безпечно копіювати рядки цим методом (що, звичайно, не є безпечним для копіювання звичайних змінних об'єктів), або краще це написати? :
String s = "hello";
String backup_of_s = new String(s);
s = "bye";
Іншими словами, яка різниця (якщо така є) між цими двома фрагментами?
EDIT - причина безпеки першого фрагмента:
Дозвольте мені пояснити речі трохи детальніше, грунтуючись на вже наданих хороших відповідях (які по суті були зосереджені на питанні про різницю продуктивності між двома фрагментами:
Струни незмінні в Java, це означає, що об'єкт String не може бути змінений після його побудови. Отже,
String s = "hello";створює новий екземпляр String і присвоює йому адресу s( sє посиланням на екземпляр / об'єкт)
String backup_of_s = s;створює нову змінну backup_of_sта ініціалізує її, щоб вона посилалась на об'єкт, на який посилається даний момент s.
Примітка. Незмінність рядків гарантує, що цей об'єкт не буде змінено: наша резервна копія в безпеці
Примітка 2: Механізм збору сміття Java гарантує, що цей об’єкт не буде знищений до тих пір, поки на нього посилається хоча б одна змінна ( backup_of_sу цьому випадку)
Нарешті, s = "bye";створює ще один екземпляр String (через незмінність - це єдиний спосіб) та змінює sзмінну, щоб вона тепер посилалась на новий об’єкт.