String s = "hello";
String backup_of_s = s;
s = "bye";
此时,备份变量仍然包含原始值“hello”(这是因为 String 的不变性吧?)。
但是用这种方法复制字符串真的安全吗(复制常规的可变对象当然不安全),还是写这个更好?:
String s = "hello";
String backup_of_s = new String(s);
s = "bye";
换句话说,这两个片段之间有什么区别(如果有的话)?
编辑 - 第一个片段安全的原因:
让我根据已经提供的好的答案(主要集中在两个片段之间的性能差异问题)更详细地解释一下事情:
字符串在 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
变量,以便它现在引用新对象。