new String(“xyz”)的时候首先查看常量池中是否有字符串''xyz"若没有的话就现在常量池中创建"abc",接着在堆内存中创建一个对象,注意这个对象和常量池中的"xyz"是没有关系的,因此此时有两个对象。
如果在一开始检测常量池中已有对象"xyz",则不在创建,只在堆内存创建对象,也就是说下面要是还有一句
String s1 = new String("xyz")的话,只有一个对象。
String s = new String("xyz");
先要明白字符串存在常量池中,即存在方法区里;方法区里包含的都是在整个程序中永远唯一的元素;
这就很好理解了若常量池已经有"xyz"对象,就不创建,没有就创建"xyz"对象.
但是肯定有一个new String("xyz")对象存在堆内存里面,并且s指向这个对象,这根new 别的类一样,对象都存在堆内存中