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
变量,使其现在引用新对象。