String s = "hello";
String backup_of_s = s;
s = "bye";
На этом этапе переменная резервной копии все еще содержит исходное значение «привет» (это из-за неизменности в String, верно?).
Но действительно ли безопасно копировать строки этим методом (что, конечно, небезопасно копировать обычные изменяемые объекты), или лучше написать это? :
String s = "hello";
String backup_of_s = new String(s);
s = "bye";
Другими словами, в чем разница (если есть) между этими двумя фрагментами?
РЕДАКТИРОВАТЬ - причина, по которой первый фрагмент безопасен:
Позвольте мне объяснить некоторые вещи немного подробнее, основываясь на уже предоставленных хороших ответах (которые были в основном сфокусированы на вопросе различий в производительности между двумя фрагментами):
Строки являются неизменяемыми в 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переменную так, чтобы она теперь ссылалась на новый объект.