第一行:字符串池创建了“中国” 对象,new一次创建一个对象
小计:4个String对象 1个字符串池对象
第二行:“中国”在字符串池已经存在,所以不创建对象直接引用
小计:0
第三、四行:“中”,“国”在字符串池不存在所以创建2次
小计:2个字符串池对象
第五行:str2 + str3=“中国”,因为“中国”已经存在,字符串池不添加,new对象添加一个
小计:1个String对象 0个字符串池对象
汇总5个String对象 3个字符串池对象
复制网上一段解释
ps:String a="abc",这行代码被执行的时候,JAVA虚拟机首先在字符串池中查找是否已经存在了值为"abc"的这么一个对象,它的判断依据是String 类equals(Object obj)方法的返回值。如果有,则不再创建新的对象,直接返回已存在对象的引用;如果没有,则先创建这个对象,然后把它加入到字符串池中,再将它的引用返 回。
我也是菜鸟,尽量把答案表达清楚,不足之处请赐教string1="aaa"
string2="aaa"
String
string3
=
new
String("aaa")
String
string4
=
new
String("aaa")
而在这四条语句中,
string1==string2;//成立
string1.equals(string2)//返回true
而
string3==string4;//false
string3.equals(string4)//返回true
弄明白这四个结果,这个问题就解决了
首先string1="aaa"和string2="aaa"
都指向常量池的同一个对象aaa
其调用==和X.
equals(Y)方法其效果是一样的
而String
string3
=
new
String("aaa")和
String
string4
=
new
String("aaa")是在heap堆中创建两个新对象,他们引用的地址是不同的,从而使得==出现不相等的情况,而X.
equals(Y)当x和Y所引用的对象是同一类对象且属性内容相等(并不一定是相同对象)时返回true,就出现了上面的结果。