String s = "hello";
String backup_of_s = s;
s = "bye";
此时,备份变量仍然包含原始值“hello”(这是由于String的不可变性吗?)。
但是使用这种方法复制字符串是否真的“安全”(这是因为通常不能安全地复制可变对象),还是最好写成这样:
String s = "hello";
String backup_of_s = new String(s);
s = "bye";
换句话说,这两个片段有什么区别(如果有的话)?
编辑 - 第一个片段为什么是安全的原因:
让我用更详细的方式解释一下,基于已经提供的好答案(它们基本上专注于2个片段之间的性能差异问题):
在Java中,字符串是不可变的,这意味着一个String对象在构建完成后就不能被修改了。 因此,
String s = "hello";
创建一个新的String实例,并把它的地址赋给s(s是指向该实例/对象的引用)
String backup_of_s = s;
创建一个新变量backup_of_s,并初始化它,使其引用当前由s引用的对象。
注意:String的不可变性保证该对象不会被修改:我们的备份是安全的
注意2:Java垃圾回收机制保证只要该对象被至少一个变量引用(在这种情况下是backup_of_s),它就不会被销毁
最后,s = "bye";
创建另一个String实例(由于不可变性,这是唯一的方法),并修改s变量,使其现在引用新的对象。
s
来引用不同的对象(即字符串“bye”)。 这不影响引用变量backup_of_s
所引用的内容(即字符串“hello”)。就像我说的,我可以提供一个使用StringBuilder(它们不是不可变的)的等效示例。 我的评论主要与OP的陈述有关:“此时,备份变量仍包含原始值“hello”(这是因为String是不可变的吗?)。" - GriffeyDog