如何在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 s = "hello";
创建一个新的字符串实例,并将其地址分配给s
(s
是对实例/对象的引用)
String backup_of_s = s;
创建一个新变量backup_of_s
并对其进行初始化,以便它引用当前由s
引用的对象
注意:字符串不变性保证这个对象不会被修改:我们的备份是安全的
注2:Java垃圾收集机制保证,只要该对象被至少一个变量引用(backup_of_s
在本例中),它就不会被销毁
最后,s = "bye";
创建另一个字符串实例(因为不变性,这是唯一的方法),并修改s
变量,以便它现在引用新对象
# 1 楼答案
您的第二个版本效率较低,因为它创建了一个额外的字符串对象,而根本不需要这样做
不变性意味着你的第一个版本按照你期望的方式运行,因此是首选的方法
# 2 楼答案
字符串是immutable objects,因此您可以复制它们,只需复制对它们的引用,因为引用的对象无法更改
因此,您可以像第一个示例中那样毫无问题地复制:
# 3 楼答案
因为字符串是不可变的,所以两个版本都是安全的。然而,后者的效率较低(它会创建一个额外的对象,在某些情况下还会复制角色数据)
考虑到这一点,应该首选第一个版本
# 4 楼答案
像这样复印怎么样? 我认为获得一个新副本更好,这样
str1
的数据在str2
被引用和进一步修改时不会受到影响# 5 楼答案
第二种情况在字符串池方面也是低效的,必须在返回引用时显式调用intern(),使其成为intern