Как мне скопировать строки в Java?
String s = "hello";
String backup_of_s = s;
s = "bye";
На этом этапе переменная резервной копии все еще содержит исходное значение «привет». (это из-за неизменности String, верно?).
Но так ли это?safe копировать строки с помощью этого метода (который, конечно, небезопасно копировать обычные изменяемые объекты), или лучше написать это? :
String s = "hello";
String backup_of_s = new String(s);
s = "bye";
Другими словами, в чем разница (если таковая имеется) между этими двумя фрагментами?
EDIT - the reason why the first snippet is safe:
Позвольте мне объяснить некоторые вещи немного подробнее, основываясь на уже предоставленных хороших ответах (которые были в основном сфокусированы на вопросе различий в производительности между двумя фрагментами):
Строки являются неизменяемыми в 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
переменная, так что теперь она ссылается на новый объект.