Как скопировать строки в Java?

    String s = "hello";
    String backup_of_s = s;
    s = "bye";

В этот момент резервная переменная по-прежнему содержит исходное значение "hello" (это из-за неизменности 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 так, чтобы теперь она ссылалась на новый объект.

Ответ 1

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

С учетом этого предпочтительной должна быть первая версия.

Ответ 2

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

Итак, вы можете скопировать, как в первом примере, без каких-либо проблем:

String s = "hello";
String backup_of_s = s;
s = "bye";

Ответ 3

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

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

Ответ 4

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

Ответ 5

String str1="this is a string";
String str2=str1.clone();

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