首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Java中复制String?

如何在Java中复制String?
EN

Stack Overflow用户
提问于 2012-05-15 20:03:46
回答 5查看 312.8K关注 0票数 228
代码语言:javascript
复制
    String s = "hello";
    String backup_of_s = s;
    s = "bye";

此时,备份变量仍然包含原始值"hello“(这是因为字符串的不可变性,对吗?)

但是,使用此方法复制字符串真的是安全(当然,复制常规可变对象是不安全的),还是编写以下代码更好呢?

代码语言:javascript
复制
    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变量,以便它现在引用新对象。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-05-15 20:04:52

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

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

票数 163
EN

Stack Overflow用户

发布于 2012-05-15 20:07:14

字符串是immutable objects,所以您可以将它们复制到它们的引用中,因为引用的对象不能更改.

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

代码语言:javascript
复制
String s = "hello";
String backup_of_s = s;
s = "bye";
票数 27
EN

Stack Overflow用户

发布于 2012-05-15 20:05:45

第二个版本的效率较低,因为它在根本不需要创建字符串对象的情况下创建额外的字符串对象。

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

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10607990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档