为什么重写 equals 还要重写 hashcode

Object 类默认的 equals 比较规则就是比较两个对象的内存地址, 默认的 hashcode 方法是根据对象的内存地址经哈希算法得来的,因此,二个对象 equals 相等,hashcode 一定相等。

hashmap 中通过 hashcode 值来定位存储的索引号,如果处于相同索引位置但存在冲突,则在通过 equal 方法来比较二个对象是否相同。

根据对象的某种性质重写了 equals 方法后,为了保证同一个对象,保证 equals 相同的情况下 hashcode 值必定相同,如果重写了 equals 而未重写 hashcode 方法,可能就会出现两个没有关系的对象 equals 相同的(因为 equal 都是根据对象的特征进行重写的),但 hashcode 确实不相同的。 如果你改写了 equal()方法,令两个实际不是一个对象的两个实例在逻辑上相等了,但是 hashcode 却是不等。所以要记得改写 hashcode。

因为重写的 equal 里一般比较的比较全面比较复杂,这样效率就比较低,而利用 hashCode()进行对比,则只要生成一个 hash 值进行比较就可以了,效率很高,那么 hashCode()既然效率这么高为什么还要 equal()呢?因为 hashCode()并不是完全可靠,有时候不同的对象他们生成的 hashcode 也会一样(生成 hash 值得公式可能存在的问题),此时产生冲突,需要通过 equal 方法解决,所以 hashCode()只能说是大部分时候可靠,并不是绝对可靠,所以我们可以得出:

  1. equal()相等的两个对象他们的 hashCode()肯定相等,也就是用 equal()对比是绝对可靠的。
  2. hashCode()相等的两个对象他们的 equal()不一定相等,也就是 hashCode()不是绝对可靠的。

#

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值