我正在研究 Kathy Sierra Java 书。我遇到了一个这样的问题:
public class A {
public static void main(String args[]){
String s1 = "a";
String s2 = s1;
//s1=s1+"d";
System.out.println(s1==s2);
}
}
输出:true
这里有两点我不明白:
- 当我取消注释
s1 = s1 + "d"
时,输出更改为false
。如果我用包装器Integer
或int
替换 String,也会发生同样的事情。 同样,当我更改我的代码以像这样使用
StringBuffer
时:StringBuffer sb = new StringBuffer("a"); StringBuffer sb2 = sb; //sb.append("c"); System.out.println(sb == sb2);
现在输出没有改变,即即使我取消注释
sb.append
语句,它仍然是true
。
我无法理解这种奇怪的行为。谁能给我解释一下。
最佳答案
s2
在第一种情况下是对 s1
的引用。在第二种情况下,+
被翻译成 s1.concat("d")
,它创建了一个新的字符串,所以引用 s1
和 s2
指向不同的字符串对象。
在 StringBuffer
的情况下,引用永远不会改变。 append
更改缓冲区的内部结构,而不是对其的引用。
关于java - 字符串对象是不可变的,但引用变量是可变的。这意味着什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30821444/