【问题标题】:Why do I need to redefine a String if I use the method replace?如果我使用方法replace,为什么我需要重新定义一个String?
【发布时间】:2014-09-05 01:13:46
【问题描述】:

如果我在这段代码中使用方法replace,为什么我需要重新定义变量theString

String theString = "I w@nt to h@ve the regul@r \"A\"!";
theString = theString.replace("@", "a");
System.out.println(theString);

为什么我不能这样做:

theString.replace("@", "a");

就这样?

【问题讨论】:

  • 我开始认为 Java 设计者通过调用此方法 replace 搞砸了。我们似乎不断地收到同样的问题。也许一个不同的名字会更清楚地表明它通过转换旧字符串来返回一个新字符串。哦,好吧……太晚了……
  • @ajb:只要Java学生一遍又一遍地自言自语,“字符串是不可变的,字符串是不可变的”,那么这应该不是问题。

标签: java string replace


【解决方案1】:

字符串是不可变的——一旦创建就无法更改。当然也有例外,如果你使用反射魔法,但在大多数情况下,它们应该被视为不变量。因此,replace(...) 方法不会更改字符串,它不能,而是创建并返回一个字符串。因此,为了能够使用该新字符串,您必须访问它的引用,这可以通过将其分配给字符串变量甚至原始字符串变量来完成。本次讨论深入探讨了对象引用变量之间的区别。

【讨论】:

    【解决方案2】:

    因为 String 对象在设计上是不可变的,所以您需要创建一个新的 String 来包含您的更改

    【讨论】:

      【解决方案3】:

      发布的答案提到了技术原因(字符串是不可变的),但忽略了为什么会这样。看到这个:Why are strings immutable in many programming languages?

      【讨论】:

      【解决方案4】:

      取自link

      在 Java 中,String 不像在其他编程语言中那样实现为字符数组。相反,字符串被实现为 String 类的实例。

      字符串是常量/不可变的,它们的值在创建后不能更改。如果执行任何导致字符串被更改的操作,则会创建并返回 String 对象的新实例。这种方法是为了 Java 的实现效率而完成的。

      当需要对 String 进行大量更改时,建议使用 StringBuffer 或 StringBuilder。 StringBuffer 类似于 String 但可以修改。 StringBuffer 是线程安全的,所有方法都是同步的。 StringBuilder 等价于 StringBuffer,供单线程使用。由于方法不同步,因此速度更快。

      【讨论】:

        猜你喜欢
        • 2020-03-06
        • 2014-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-17
        • 2015-07-10
        • 1970-01-01
        相关资源
        最近更新 更多