码迷,mamicode.com
首页 > 其他好文 > 详细

String奇妙冒险及==和hashcode

时间:2020-03-10 13:52:28      阅读:65      评论:0      收藏:0      [点我收藏+]

标签:地址   返回   support   引用   imp   ble   one   相等   基本   

 1 public static void main(String[] args) {
 2         String s1 = "ni";
 3         String s2 = "hao";
 4         String s3 = "nihao";
 5         String s4 = "ni" + "hao";
 6         String s5 = s1 + s2;
 7         System.out.println(s3 == s4);
 8         System.out.println(s3 == s5);
 9         System.out.println(s3.equals(s5));
10         System.out.println(s3.hashCode() == s5.hashCode());
11 }

执行结果

true
false
true
true

第一个输出结果大伙应该都知道,String在常量池里找到"nihao"就直接返回地址引用

第二个是因为等号后面有变量(假设是String s5 = s1 + "hao"结果也是一样),他都必须new一个新的String对象出来,就不回去常量池里找了

第三个大伙应该也知道String的equals方法被重写了,比较的是值一不一样而不是地址值

第四个就是典型地验证了 == 不相等的哈希值可能相等,估摸着就是算着俩对象一样哈希值一样拉链法给s5扔s3那颗红黑树里了(更可能是链表,就这么小的世界不会那么巧8 ^ ^_ )

 

根据第四个延申会不会两个对象长一样哈希值就一样呢,立刻实验

 1 public class WhatEver implements Cloneable{
 2             public static void main(String[] args) {
 3                 WhatEver o1 = new WhatEver();
 4                 WhatEver o2 = null;
 5                 try {
 6                     o2 = (WhatEver) o1.clone();
 7                 } catch (CloneNotSupportedException e) {
 8                     e.printStackTrace();
 9                 }
10                 System.out.println(o1.hashCode() == o2.hashCode());
11     }
12 }

执行结果

false

clone出来基本保证俩对象一样,结果却是false,俺也不知道咋回事了,懂的评论一下,去研究hashcode了

String奇妙冒险及==和hashcode

标签:地址   返回   support   引用   imp   ble   one   相等   基本   

原文地址:https://www.cnblogs.com/2016024249-/p/12455155.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!