S1和S5有什么区别,好像输出结果都是hello,world,==比较对象类型是比较地址,字符串在常量池都有,为什么结果一个是True一个是False
个人的浅见。
第一,jvm中s2和s3跟s1都不相等(在常量池中)
第二,s4是字面量的想加,会在常量池中寻找,发现s1和s4相等,此时返回常量池中s1的引用地址
第三,s5为s2和s3想加,会返回堆中的引用地址
因为他们的地址不一样。
字符串拼接是这样的 给s4赋值的时候 池里面已经有了 Hello,world Hello, world 三个对象。 当把Hello, + world 实际上会把他们拼接起来 然后去池里面找有没有。发现已经有了Hello,world 就直接返回其引用地址给 s4所以 , s1跟s4比较结果为true,s2加s3产生了新对象 所以跟s4的地址不一样。
拼接完是一个新的对象