Ответ 1
Поскольку строки неизменяемы, обе версии являются безопасными. Последний, однако, менее эффективен (он создает дополнительный объект и в некоторых случаях копирует данные символа).
С учетом этого предпочтительной должна быть первая версия.
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
так, чтобы теперь она ссылалась на новый объект.
Поскольку строки неизменяемы, обе версии являются безопасными. Последний, однако, менее эффективен (он создает дополнительный объект и в некоторых случаях копирует данные символа).
С учетом этого предпочтительной должна быть первая версия.
Строки неизменяемые объекты, поэтому вы можете копировать их, просто копируя ссылку на них, потому что ссылка на объект не может быть изменена...
Итак, вы можете скопировать, как в первом примере, без каких-либо проблем:
String s = "hello";
String backup_of_s = s;
s = "bye";
Ваша вторая версия менее эффективна, потому что она создает дополнительный строковый объект, когда просто не нужно этого делать.
Неизменность означает, что ваша первая версия ведет себя так, как вы ожидаете, и, таким образом, подход должен быть предпочтительным.
Второй случай также неэффективен с точки зрения пула строк, вам нужно явно вызвать intern() для ссылки return, чтобы сделать его стажером.
String str1="this is a string";
String str2=str1.clone();
Как насчет копирования?
Я думаю, что получить новую копию лучше, так что данные str1
не будут затронуты, когда str2
будет ссылкой и изменен в дальнейшем действии.