初学java的在校生,今天在复习String内容的时候看笔记照着敲的,果然温故而知新。发现了新大陆但我百思不得其解,请cnds的友友们解答
String a="a";
String b="b";
String c=a+b;
String d=a+b;
System.out.println(d.hashCode());
System.out.println(c.hashCode());
System.out.println(c==d);
3105
3105
false
常量相加是在池中,变量相加是在堆中,c和d都是由变量a+b得到的,所以是在堆,==比较的是地址值,我没有new的情况下,c和d不是指向同一个堆地址吗?用==比较同一个地址为什么还会是false呢?欢迎各位人生导师斧正。
1.字符串拼接底层实际上是StringBuilder做的append,两个拼接都创建了新的对象,所以 == 是false
2.之所以hashcode是一样的,String重写了hashcode方法,实际上是 根据字符串算的,字符串内容不变 hashcode也不变
a+b 给你优化成 new String( a + b) 了