Как мне скопировать строки в Java?
==================================

На этом этапе переменная резервной копии все еще содержит исходное значение «привет». (это из-за неизменности String, верно?).

Но так ли это?**safe** копировать строки с помощью этого метода (который, конечно, небезопасно копировать обычные изменяемые объекты), или лучше написать это? :

Другими словами, в чем разница (если таковая имеется) между этими двумя фрагментами?

**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` переменная, так что теперь она ссылается на новый объект.

 обе версии безопасны. Последний, однако, менее эффективен (он создает дополнительный объект и в некоторых случаях копирует символьные данные).

 Учитывая это, первая версия должна быть предпочтительной.



 потому что она создает дополнительный строковый объект, когда в этом просто нет необходимости.

Immutability означает, что ваша первая версия ведет себя так, как вы ожидаете, и, таким образом, это предпочтительный подход.



 вы должны явно вызвать intern () при возврате ссылки, чтобы сделать его интерном.



 [immutable objects](https://docs.oracle.com/javase/tutorial/essential/concurrency/immutable.html) так что вы можете скопировать их, просто скопировав ссылку на них, потому что объект, на который ссылаются, не может измениться ...

 Так что вы можете без проблем скопировать, как в первом примере:



 что получить новую копию лучше, так что данные`str1` не будет затронуто, когда`str2` является ссылкой и изменен в дальнейшем действии.