String s = new String("abc") |
我们可以把上面这行代码分成String str、=、"abc"和new String()四部分来看待。
String str只是定义了一个名为str的String类型的变量,因此它并没有创建对象;
=是对变量str进行初始化,将某个对象的引用(或者叫句柄)赋值给它,显然也没有创建对象;
最后,new String("abc")看成"abc"和new String();
1.new String()创建了一个对象
2."abc";,这行代码被执行的时候,JAVA虚拟机首先在字符串池中查找是否已经存在了值为"abc"的这么一个对象,它的判断依据是String类equals(Object obj)方法的返回值。如果有,则不再创建新的对象,直接返回已存在对象的引用;如果没有,则先创建这个对象,然后把它加入到字符串池中,再将它的引用返回。要是你前面没有出现这种用" "双引号格式创建“abc”字符串对象的话,那么就有两个对象,要是之前创建了,那么这里就只创建一个对象,"abc"就从字符串常量池中取出来。
|