详解为什么需要重写hashcode 和 equals 方法

Posted helloqiufei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了详解为什么需要重写hashcode 和 equals 方法相关的知识,希望对你有一定的参考价值。

在HashMap 中 底层时候用的 数组 + 链表 + 红黑树的形式

那现在put(key,value), 他是先计算key的hash 值,通过hash 值找到数组的下标, 判断这个位置是否有对象

没有对象,则将value 放进去, 如果有对象,再去比较这两个对象之间是否相等

问题出现: 比较这两个对象相等,是调用equals 方法, 如果类里面没有覆写equals 方法, 则调用object 对象的equals 方法 即“==” 判断对象

                     那两个对象里面的值相同, 也会被判定成不同的对象,被追加当前链表的尾部。

结果方案:

               所以需要类重写equals 方法

问题出现: 在寻找数组下标的时候,使用hashcode ,相同的对象hashcode 一定相同, 不同的对象hashcode 值可能相同,也可能不同

     所以当两个内容相同对象,找对应的数组的下标的时候,就是不一样的,这样直接造成有两个内容相同的key, 因为这里key我们

      要求的就是内容不同, 所以出现问题

解决方案:

             需要覆写hashCode()

以上是关于详解为什么需要重写hashcode 和 equals 方法的主要内容,如果未能解决你的问题,请参考以下文章

详解equals()方法和hashCode()方法

详解equals()方法和hashCode()方法

重写了equals方法为何需要重写 hashCode

关于equals与hashcode的重写

为什么要重写equals和hashcode方法

两个对象相等(==equalshashCode)详解