有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何在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";创建一个新的字符串实例,并将其地址分配给ss是对实例/对象的引用)

String backup_of_s = s;创建一个新变量backup_of_s并对其进行初始化,以便它引用当前由s引用的对象

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

注2:Java垃圾收集机制保证,只要该对象被至少一个变量引用(backup_of_s在本例中),它就不会被销毁

最后,s = "bye";创建另一个字符串实例(因为不变性,这是唯一的方法),并修改s变量,以便它现在引用新对象


共 (5) 个答案

  1. # 1 楼答案

    您的第二个版本效率较低,因为它创建了一个额外的字符串对象,而根本不需要这样做

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

  2. # 2 楼答案

    字符串是immutable objects,因此您可以复制它们,只需复制对它们的引用,因为引用的对象无法更改

    因此,您可以像第一个示例中那样毫无问题地复制:

    String s = "hello";
    String backup_of_s = s;
    s = "bye";
    
  3. # 3 楼答案

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

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

  4. # 4 楼答案

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

    像这样复印怎么样? 我认为获得一个新副本更好,这样str1的数据在str2被引用和进一步修改时不会受到影响

  5. # 5 楼答案

    第二种情况在字符串池方面也是低效的,必须在返回引用时显式调用intern(),使其成为intern