String s = new String("abc");
很多人都知道是创建了两个对象。
一个是常量池中的常量,一个是堆中new出的对象。
那么,如果常量池中已经存在了一个常量"abc"呢?
众所周知,常量池是在编译器已经确定好的,
其中包括:类、方法、接口中的常量,也包括特殊的字符串常量。
String s = "abc";
这句代码过程大致:
String s创建一个引用,JVM去pool寻找"abc",找到后指向,
找不到创建对象、放进常量池再返回指向,判断依据是equals。
String s = new String("abc");
这句代码过程大致:
String s创建一个引用,JVM去pool寻找"abc",找不到就创建,
注意这里找到找不到都不指向。接着在堆中创建了一个字符串对象,引用指向了堆中对象。
OK,我写了这么多,我想说的是如果常量池中存在了字符串常量,
那么String s = new String("abc");就只会在堆中创建一个对象了吧?
这种情况适用于:
String s = "abc";
String s = new String("abc");
这时候第二句就只创建了一个对象?不知道这样说理解是否有误,请高手指教。
还有,下面这一句,是创建了几个对象?
String str=new String()+"abc"一共创建了几个对象?
|