Java字符串是不可变的吗?

时间:2013-09-05 11:20:51

标签: java string immutability

我不明白这段代码,为什么我的字符串c不会在main方法中更改,而是在changeString中更改。你能解释一下吗?

class MainClass {
    public static void main(String[] args) {
        String c = "lalala";
        changeString(c);
        System.out.println("str in main = "+c);
    }

    public static void changeString(String str) {
        str = str + "CHANGE!!!";
        System.out.println("str in changeString = "+str);
    }

}

结果:

str in changeString = lalalaCHANGE!!!
str in main = lalala

4 个答案:

答案 0 :(得分:4)

是的,java字符串是不可变的。

changeString中,您传入对字符串lalala的引用,然后您将引用更改为指向lalalaCHANGE!!!的引用。原始字符串对象未更改,main中的引用仍引用该原始对象。

如果您要使用StringBuilder而不是字符串,并将CHANGE!!!附加到该StringBuilder,那么您会看到在main中查看时所反映的更改:

class MainClass {
    public static void main(String[] args) {
        StringBuilder c = new StringBuilder("lalala");
        changeString(c);
        System.out.println("str in main = "+c.toString());
    }

    public static void changeString(StringBuilder str) {
        str.append("CHANGE!!!");
        System.out.println("str in changeString = "+str.toString);
    }

}

在这个改变的版本中你会得到:

str in changeString = lalalaCHANGE!!!
str in main = lalalaCHANGE!!!

答案 1 :(得分:2)

  

Java String是不可变的吗?

字符串是不可变的,这意味着您无法更改对象本身,但您可以更改引用的参考。

因此,当您使用changeString方法执行此操作时:

str = str + "CHANGE!!!";

创建一个新的字符串内存对象。但是c方法中的main引用仍然指向旧的sting内存对象,因此会打印lalala

答案 2 :(得分:1)

字符串是不可变的,当然:

  

注意:String类是不可变的,因此一旦创建了它   字符串对象无法更改。 String类有许多   方法,其中一些将在下面讨论,似乎可以修改   字符串。因为字符串是不可变的,所以这些方法真正做的是   创建并返回一个包含结果的新字符串   操作

http://docs.oracle.com/javase/tutorial/java/data/strings.html

str = str + "CHANGE!!!";

此代码返回一个不同的String并将其引用替换为您的变量,但原始String没有更改。

答案 3 :(得分:0)

是的,Java String是不可变的。

  

字符串是不变的;它们的值在创建后无法更改。

And String in java has very special treatment

在此处阅读更多内容: