我应该如何复制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实例并将其地址分配给s
( s
是对实例/对象的引用)
String backup_of_s = s;
创build一个新的variablesbackup_of_s
并初始化它,以便它引用s
当前引用的对象。
注意:string不可变性保证这个对象不会被修改:我们的备份是安全的
注2:Java垃圾收集机制保证只要至less有一个variables被引用,这个对象就不会被销毁(在本例中为backup_of_s
)
最后, s = "bye";
创build另一个String实例(由于不变性,这是唯一的方法),并修改s
variables,以便它现在引用新的对象。
由于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
是参考和修改进一步的行动。