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