-5

我不明白这段代码,为什么我的字符串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

4 回答 4

4

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

changeString中,您传入对字符串的引用lalala,然后将引用更改为指向的引用lalalaCHANGE!!!。原始字符串对象没有改变,并且 in 中的引用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!!!
于 2013-09-05T11:22:45.093 回答
3

Java字符串是不可变的吗?

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

因此,当您在changeString方法中执行此操作时:

str = str + "CHANGE!!!";

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

于 2013-09-05T11:22:38.337 回答
1

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

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

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

str = str + "CHANGE!!!";

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

于 2013-09-05T11:23:39.993 回答
0

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

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

而java中的String有很特殊的处理

在这里阅读更多:


于 2013-09-05T11:21:21.990 回答