String new Object和comparision

时间:2018-05-08 05:22:25

标签: java string operators

据我所知,String上的任何更改都会创建一个新的Object,对于某些运行时活动,如果有内容更改,那么新的对象将在Heap中创建,但是我对下面的情况感到困惑,请提出想法...

String s8="abcd";
String s9=s8.toUpperCase();
String s11=s8.toUpperCase();
System.out.println("S9 "+s9.hashCode() +"  s10 "+s11.hashCode());//S9 -- 2001986  s10 -- 2001986
System.out.println(s9==s11);//false

在上面的场景中,地址打印相同,但==运算符shaowing false。

请说明为何地址相同且比较错误。

2 个答案:

答案 0 :(得分:1)

String s8="abcd"; : Memory will be allocated from constant pool.

String s9=s8.toUpperCase(); New object will be created on heap

String s11=s8.toUpperCase(); Another  New object will be created on heap

如果你看一下toUpperCase

的实现
public String toUpperCase(Locale locale) {

..

return new String(result, 0, len + resultOffset);

因此每次都会在堆上创建一个新对象。因此s9 != s11

  

注意:如果两个对象相等,那么它们的哈希码是相同的但是相反   反之亦然

<强>更新

String s11=s9.toUpperCase();
s11==s9 // returns true 

因为没有可以修改的字符,因此s11和s9都指向同一个对象。我强烈建议您阅读实施

答案 1 :(得分:0)

==运算符用于引用comperison。基本上,当您创建s9s11时,在堆中只创建了一个对象。这就是为什么这2个哈希码是相同的,2个不同的引用指向同一个对象。这就是为什么s9==s11已经失败了。