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

时间:2012-05-15 20:03:47

标签: java

    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实例,并将其地址分配给ss作为对实例/对象的引用)

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

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

注2:Java垃圾收集机制保证只要该对象被至少一个变量(在这种情况下为backup_of_s)引用,就不会销毁该对象。

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

5 个答案:

答案 0 :(得分:118)

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

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

答案 1 :(得分:17)

字符串是immutable objects所以你可以复制它们只是复制对它们的引用,因为引用的对象不能改变......

所以你可以像第一个例子一样复制,没有任何问题:

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

答案 2 :(得分:10)

你的第二个版本效率较低,因为它在没有必要的情况下创建了一个额外的字符串对象。

不变性意味着您的第一个版本的行为与您期望的一样,因此是首选版本。

答案 3 :(得分:0)

第二种情况在字符串池方面也是低效的,你必须在返回引用上显式调用intern()以使其成为实习生。

答案 4 :(得分:-13)

String str1="this is a string";
String str2=str1.clone();

这样复制怎么样? 我认为获取新副本会更好,因此str1的数据在str2被引用并在进一步操作中进行修改时不会受到影响。