我应该如何复制Java中的string?

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

在这一点上,备份variables仍然包含原来的值“你好”(这是因为string的不变性权利?)。

但是用这种方法复制string是非常安全的 (复制常规的可变对象当然是不安全的),还是写这个更好? :

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

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


编辑 – 为什么第一个片段是安全的:

基于已经提供的良好答案(本质上集中在两个片段之间的性能差异问题上),让我稍微详细地解释一下:

string在Java中是不可变的,这意味着一个String对象在构造之后不能被修改。 因此,

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

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

注意:string不可变性保证这个对象不会被修改:我们的备份是安全的

注2:Java垃圾收集机制保证只要至less有一个variables被引用,这个对象就不会被销毁(在本例中为backup_of_s

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

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

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

string是不可变的对象,所以你可以复制他们只是应对引用,因为引用的对象不能改变…

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

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

你的第二个版本效率不高,因为它在没有必要的时候创build一个额外的string对象。

不变性意味着你的第一个版本的行为方式是你期望的,因此是首选的方法。

第二种情况在string池方面也是效率低下的,你必须显式调用intern()返回引用来使其成为实体。

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

如何复制这样的? 我认为得到一个新的副本更好,这样str2的数据将不会受到影响时, str2是参考和修改进一步的行动。