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对象在构造后不能被修改。 因此,
字符串s = "hello";创建一个新的String实例并将其地址赋给s (s是对实例/对象的引用)
字符串backup_of_s = s;创建一个新变量backup_of_s并初始化它,以便它引用s当前引用的对象。
注意:字符串不可变性保证该对象不会被修改:我们的备份是安全的
注2:Java垃圾收集机制保证只要该对象被至少一个变量(在本例中为backup_of_s)引用,它就不会被销毁。
最后,s = "bye";创建另一个String实例(因为不可变性,这是唯一的方法),并修改s变量,使它现在引用新对象。