先看代码
String a="abc";
String b=new String("abc");
System.out.println(a==b);//打印结果为false
b=b.intern();
System.out.println(a==b);//打印结果为true
- 当String a=“abc”;执行的时候,先在栈内存中给a创建一个引用变量,在常量池中创建一个"abc"的字符串,a指向"abc";
- 当String b=new String(“abc”);执行的时候,先在栈内存中给b创建一个引用变量,在堆内存中创建一个String对象,在String对象中存放着指向"abc"的地址引用值,因此b指向String对象,String对象指向"abc"
- 因此执行System.out.println(a == b);的时候,a和b的地址引用值不同,因此返回false
- 当b=b.intern();执行后,首先会判断b的字符串是否在常量池;如果有,则把"abc"的地址引用值反向指回b
- 因此执行System.out.println(a ==b);的时候,a和b都指向常量池中的"abc",因此返回true