2012-06-08 35 views
2

我有下面这样的程序问题为什么在Java中的String.Replace之后没有更改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为最佳方案,但我惊讶的输出是测试。

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

在此先感谢。

+0

为什么*会改变*?请使用[文档](http://docs.oracle。com/javase/7/docs/api/java/lang/String.html)提供支持信息。 (许多“为什么不”问题可以通过查看“为什么/如何做”来回答或提炼。) – 2012-06-08 15:16:05

回答

13

字符串在Java中是不可变的,这意味着你不能改变它们。当你调用replace方法时,你实际上正在创建一个新的String。

你可以做到以下几点:

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

这是一个重新分配。

6

String.replace不会更改字符串内容,但会返回替换结果。 你应该做到以下几点,而不是

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

非常感谢您的解释。 – Pawan

+0

当然没问题:) – GETah

2

字符串在Java是不变的 - 它们不能被改变。当你使用像str.replace这样的函数,而不是在原地更改字符串时,它会返回一个新的String对象,其中包含您请求的更改。这在documentation for String中有解释:

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

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

2

字符串类是不可变的。因此,无论您在String对象上执行什么操作,都会返回一个新的字符串对象。

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

0

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

1

String对象在java中是不可变的,即无论何时在String上完成修改而不是修改它,都会在内存中创建新的String对象。

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

str = str.replace('T', 'B'); 
相关问题