为什么在Java中的String.Replace之后String值没有改变?

时间:2012-06-08 15:00:42

标签: java string

我对以下程序有疑问

请参阅下面的程序

public class Kiran {

    public static void main(String args[]) {

        String str = "Test";

        str.replace('T', 'B');

        System.out.println("The modified string is now " + str);
    }

}

我所期待的是,一旦我运行这个程序,我应该看到putput为Best,但令我惊讶的是输出是Test。

请有人告诉我,为什么会这样?

提前致谢。

6 个答案:

答案 0 :(得分:13)

String在Java中是不可变的,这意味着您无法更改它们。当您调用replace方法时,实际上是在创建一个新的String。

您可以执行以下操作:

String str = "Test";
str = str.replace('T', 'B');

哪个是重新分配。

答案 1 :(得分:6)

String.replace不会更改字符串内容,但会返回替换结果。 您应该执行以下操作

str = str.replace('T', 'B');

答案 2 :(得分:2)

Java中的字符串是不可变的 - 它们无法更改。当您使用像str.replace这样的函数时,它不是就地更改字符串,而是返回一个新的String对象,其中包含您请求的更改。这在documentation for String

中有解释
  

返回一个新字符串,该字符串是用newChar替换此字符串中所有出现的oldChar而生成的。

为了将来参考,Java的文档非常全面,并详细解释了方法所期望的参数,返回的内容以及它们具有的副作用(如果有的话)。

答案 3 :(得分:2)

String类是不可变的。因此,您在String对象上执行的任何操作都将返回 new String对象。

您必须将replace操作的结果分配给String变量,以便获得结果。

答案 4 :(得分:1)

String对象在java中是不可变的,即只要对String进行修改而不是修改它,就会在内存中创建一个新的String对象。

方法str.replace('T', 'B')在堆内存中创建了一个新的String对象,但该对象未被任何字符串变量引用。要引用该对象,您必须将其分配给String变量:

str = str.replace('T', 'B');

答案 5 :(得分:0)

除了上述答案之外,如果您要广泛修改(添加/删除)数据,最好使用StringBuffer(线程安全)或StringBuilder(非线程安全)&完成修改后将其强制转换为String。