我应该如何在Java中复制字符串?

2022-08-31 05:50:56
    String s = "hello";
    String backup_of_s = s;
    s = "bye";

此时,备份变量仍包含原始值“hello”(这是因为 String 的不可变性,对吗?)。

但是,使用此方法复制 Strings 真的安全吗(复制常规可变对象当然不安全),还是最好这样编写?:

    String s = "hello";
    String backup_of_s = new String(s);
    s = "bye";

换句话说,这两个片段之间有什么区别(如果有的话)?


编辑 - 第一个代码段安全的原因:

让我根据已经提供的良好答案(基本上集中在2个片段之间的性能差异问题上),更详细地解释一下事情:

字符串在 Java 中是不可变的,这意味着 String 对象在构造后无法修改。因此

String s = "hello";创建一个新的 String 实例并将其地址分配给 ( 作为对实例/对象的引用)ss

String backup_of_s = s;创建一个新变量并对其进行初始化,以便它引用 当前由 引用的对象。backup_of_ss

注意:字符串不可变性保证此对象不会被修改:我们的备份是安全的

注2:Java垃圾回收机制保证只要该对象被至少一个变量引用(在本例中),就不会被破坏backup_of_s

最后,创建另一个 String 实例(由于不可变性,这是唯一的方法),并修改变量,使其现在引用新对象。s = "bye";s


答案 1

由于字符串是不可变的,因此两个版本都是安全的。然而,后者的效率较低(它会创建一个额外的对象,并在某些情况下复制字符数据)。

考虑到这一点,第一个版本应该是首选。


答案 2

字符串是不可变的对象,因此您可以复制它们,只需处理对它们的引用,因为引用的对象无法更改...

因此,您可以像第一个示例一样复制,而不会出现任何问题:

String s = "hello";
String backup_of_s = s;
s = "bye";

推荐