当前位置: 首页 > 知识库问答 >
问题:

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

史淇
2023-03-14
    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是对实例/对象的引用)

字符串backup_of_s=s;创建新变量backup_of_s并对其进行初始化,使其引用s当前引用的对象。

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

注意2:Java垃圾收集机制保证这个对象只要被至少一个变量引用(本例中为backup_of_s)就不会被破坏

最后,s=“bye”;创建另一个字符串实例(由于不可变性,这是唯一的方法),并修改s变量,使其现在引用新对象。

共有1个答案

曹光霁
2023-03-14

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

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

 类似资料:
  • 问题内容: 此时,备份变量仍包含原始值“ hello”(这是由于String的不可变性对吗?)。 但是用这种方法复制字符串是否真的 安全 (复制常规可变对象当然不安全),还是写这个更好呢?: 换句话说,这两个摘要之间有什么区别(如果有)? 编辑-第一个代码段为何安全的原因: 让我基于已经提供的良好答案(主要侧重于两个摘要之间的性能差异问题),对事情进行更详细的说明: 字符串在Java中是不可变的,

  • 问题内容: 我在bash中有以下字符串 我想从创建一个。该包含重复直到长度= 20这样的结果应该是这样的: 在bash中如何做? 问题答案: 这应该工作:

  • 问题内容: 这个问题在很多地方都被问到,变化不尽。例如Java-getClassLoader()。getResource()不仅使我烦恼不已。)我仍然无法使其正常工作。 这是一个代码片段: 此作品-请注意,我硬编码的路径,包含剪辑文件,该文件的目录 是 有,而且 是 在同一目录作为我的.class文件。las,注释掉的代码仅返回url的空值。 其他大多数帖子似乎都涉及getResourceAsSt

  • 我正在做我的神经网络项目,在数据集中我只有字符串值,但我知道NN只接受数字值,所以我如何将字符串转换为double,如下所示:

  • 我有两个字符串str1和str2。我试图用字符把一些字母从一个字符串复制到另一个字符串。我知道我可以使用字符串复制,但我想要一些字符,而不是全部字符。 在Java中,如何将子字符串从一个字符串复制到另一个字符串?

  • 问题内容: 如何取一个并制作一个副本,但没有第一个String?示例:如果我有这个… 我如何制作一个像字符串集合颜色一样但没有红色的新字符串呢? 问题答案: 您可以使用: