重写equals为什么要重写hashcode

 三个方面去理解“重写equals为什么要重写hashcode”:

1.Object中hashCode()的源码注释

1. 源码 hashCode()的注释的最后一段的括号中写道:将对象的地址值映射为integer类型的哈希值。

2. 源码 equals()的注释:当我们将equals方法重写后有必要将hashCode方法也重写,这样做才能保证不违背hashCode方法中“相同对象必须有相同哈希值”的约定。

3. Object类中的equals方法区分两个对象的做法是比较地址值,即使用“==”。而我们如若根据业务需求改写了equals方法的实现,那么也应当同时改写hashCode方法的实现。否则hashCode方法依然返回的是依据Object类中的依据地址值得到的integer哈希值。

2.从String的equals()方法去看

1. String对象在调用equals方法比较另一个对象时,除了认定相同地址值的两个对象相等以外,还认定对应着的每个字符都相等的两个String对象也相等,即使这两个String对象的地址值不同(即属于两个对象)。
2. String类中对equals方法进行重写扩充了,但是如果此时我们不将hashCode方法也进行重写,那么String类调用的就是来自顶级父类Obejct类中的hashCode方法。即,对于两个字符串对象,使用他们各自的地址值映射为哈希值,导致结果最后不同。

3.从集合类的源码中去看

1. HashMap存储数据的时候,是取的key值的哈希值,然后计算数组下标,采用链地址法解决冲突,然后进行存储。
2. 取数据的时候,依然是先要获取到哈希值,找到数组下标,然后for遍历链表集合,进行比较是否有对应的key。


参考链接:
https://zhuanlan.zhihu.com/p/50206657
https://www.jianshu.com/p/0e1176a9bad1
https://blog.csdn.net/xl_1803/article/details/80445481 (这篇文章下面评论较多)

天助自助者
原文地址:https://www.cnblogs.com/ZeGod/p/13320785.html