版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_36570478/article/details/81353816
public class QuoteTest {
private static String quote1 = "test";
private static String quote2 = "test";
private static String newString = new String("test");
static void operate(StringBuffer x, StringBuffer y) {
x.append(y);
y = x;
}
public static void main(String[] args) {
System.out.println(quote1 == quote2);
System.out.println(quote1 == newString);
System.out.println(quote1 == newString.intern());
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
operate(a, b);
System.out.println(a + "." + b);
}
}
//:output~
true
false
true
AB.B
分析quote1==quote2:
在初始化String常量时,先去string pool寻找是否"test"字符串,如果存在则直接指向"test"所在地址,否则在string pool中创建"test"字符串。所以,quote1初始化过程中string pool中创建了一份"test",而quote2在初始化时,由于"test"已经存在,所以直接指向quote1创建的"test"。
分析quote1 != newString:
newString,通过new创建,在创建时检测到string pool中已存在“test”字符串,故在堆中申请一块内存,内存内容为quote1指向的"test"地址,quote1 == newString.intern(),可以证明这一点。
分析operate()函数运行结果:
x 指向a指向的地址,y指向b指向的地址,x.append(y)是对a指向的对象直接进行操作,将改变a指向的地址的内容。y=x,将y指向的地址赋值为a所在的地址,不对b所指向的内容造成影响。