首先,a==b 为false。a指代常量池中“abc”的地址,而b指代堆中“abc”的地址。
String a = “abc”;
1.栈中开辟一块空间存放
2.String池中开辟一块空间存“abc”
3.指针a指向常量池中的“abc”
4.a所指代的地址即为常量池中“abc”的地址,a==“abc”为true
String b = new String(“abc”);
1.栈中开辟一块空间存放b
2.堆中开辟一块空间存放一个新建的string对象“abc”
3.指针b指向堆中的“abc”
4.b指代的是 堆中“abc”的地址,而常量“abc”存在常量池中,故 b==“abc”为false
注意 :通过new产生的对象,会先去常量池检查有没有“abc”,如果没有,先在常量池中创建一个该对象,再在堆中拷贝一个常量池中的“abc” 。如果有直接创建拷贝对象。
有道面试题: String s = new String(“xyz”); 产生几个对象?
答:一个或两个。
如果常量池中没有,就创建一个“xyz”,再创建一个堆中的拷贝对象。
如果有,就直接创建一个堆中拷贝对象。