首先明确一点,在Java中==比较的是两个对象的地址,equals()比较的是两个对象的值,如果使用equals()来替换==,则两个输出结果都为true。
言归正传,为什么第一个返回为false?
先看一下intern()这个方法的描述:
大意就是是一个字符串调用interned()方法的时候,如果池中有和这个字符串值相等的字符串,就会将池中的字符串返回,如果没有,就将这个字符串添加进去,并返回这个字符串的引用。
but,通过new String("string")这个构造方法是先在字符串池中创建了构造参数"string",这是第一次创建,字符串池中保存的是第一次的引用。接着new String()从字符串池中复制了"string",在堆中重新创建的了一次对象,这是第二次创建,所以调用interned()之后返回的是第一次创建的字符串池中的"string",而str1是堆中的"string",值相同但是地址不一样,所以==为false。
str2的StringBuilder的toString()
是通过char[]调用String数组,在字符串池中创建了abcdef这个字符串,字符串中保存的str2的引用,所以调用interned()的时候返回的是str2的引用,所以==为true。
这个问题我刚看到也是不知道为什么,也是思考了一下午直到现在才想明白。希望多提这种问题来促进大家的思考和交流,共同成长。