为什么重写 equals 方法要重写 hashCode 方法

文章讨论了在Java中重写equals和hashCode方法的重要性。当两个对象根据equals方法相等时,它们的hashCode必须相同,以遵循Object类的约定。不遵守这一约定会影响基于散列的集合,如HashMap的正常工作。hashCode的存在是为了提高比较效率,通过散列值快速过滤掉不同的对象,只对可能相等的进行equals比较。
摘要由CSDN通过智能技术生成

前言

  看了挺多关于这个问题相关的文章,发现回答缺少因果逻辑。直到看了一篇文章提到 《Effective Java》中有关于这个问题的答案。于是找了电子书看了一下,查看相关源码理清了因果逻辑,得出怎样回答这个问题比较好。
在这里插入图片描述

1 hashCode 的通用约定

查看 Object 类的源码
在这里插入图片描述
简单理解:

  1. 两个对象根据 equals 方法返回 true,那么这两个对象的 hashCode 必须相等。
  2. 两个对象根据 equals 方法返回 false,那么不要求这两个对象的 hashCode 不相等。

2 为什么重写 equals 方法要重写 hashCode 方法

  因为,不重写 hashCode 方法,会出现两个对象根据 equals 方法比较后返回 true,然而这两个对象的 hashcode 值不相等。这违反了 Object.hashCode 的使用约定,从而使该类无法与基于散列值的集合类一块运作,比如 hashMap。

3 为何要有 hashCode 这个 int 值

  Object 类的 equals 方法很简单。从源码上看,比较两个对象的内存地址。
在这里插入图片描述
  但重写之后的类的 equals 方法往往很复杂。比如 String 类的 equals 方法
在这里插入图片描述
  这就使得 equals 方法的效率低。为了提高比较效率,所以有了 hashcode 这个值。基于散列值的集合类,根据 hashcode 使用约定,当 hashCode 值不同,就没必要比较 equals 方法。当 hashCode 值相同时,再比较 equals 方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值