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