千家信息网

为什么要重写equals和hashcode

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要介绍"为什么要重写equals和hashcode",在日常操作中,相信很多人在为什么要重写equals和hashcode问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对
千家信息网最后更新 2026年11月03日为什么要重写equals和hashcode

这篇文章主要介绍"为什么要重写equals和hashcode",在日常操作中,相信很多人在为什么要重写equals和hashcode问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"为什么要重写equals和hashcode"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

  1. 首先我们分别解释equals()方法和hashCode()方法分别是用来做什么的?

  2. 我们再来看equals()方法和hashCode()方法两者有什么关系?

  3. 最后来看为什么重写equals()就一定要重写hashCode()方法?


1.首先我们分别解释equals()方法和hashCode()方法分别是用来做什么的?

equals()方法:

很明显,该方法就是用来判断两个对象是否是同一个对象。在Object类源码(如下所示)中,其底层是使用了"=="来实现,也就是说通过比较两个对象的内存地址是否相同判断是否是同一个对象。

     public boolean equals(Object obj){           return (this == obj); }

但是在实际应用中,该方法不能满足的我们的需求。因为我们认为两个对象即使不是指向的同一块内存,只要这两个对象的各个字段属性值都相同,那么就认为这两个对象是同一个对象。所以就需要重写equals()方法,即如果两个对象指向内存地址相同或者两个对象各个字段值相同,那么就是同一个对象。


hashCode()方法:

一提到hashcode,很自然就想到哈希表。将某一key值映射到表中的一个位置,从而达到以O(1)的时间复杂度来查询该key值。Object类源码(如下所示)中,hashCode()是一个native方法,哈希值的计算利用的是内存地址。

  public native int hashCode();

可以认为利用哈希表也能起到一定的判重的作用,但是现实是可能存在哈希冲突,即使是两个不同的对象,他们的哈希值也可能相同,如何解决哈希冲突,这里就略略略了。总之,我们记住哈希表具有优越的查询性能,并且存在哈希冲突。

2、我们再来看equals()方法和hashCode()方法两者有什么关系?

两者事实关系如下:

  1. 如果两个对象相同(即用equals比较返回true),那么它们的hashCode值一定要相同!!!!;

  2. 如果两个对象不同(即用equals比较返回true),那么它们的hashCode值可能相同也可能不同;

  3. 如果两个对象的hashCode相同(存在哈希冲突),那么它们可能相同也可能不同(即equals比较可能是false也可能是true)

  4. 如果两个对象的hashCode不同,那么他们肯定不同(即用equals比较返回false)

3、最后来看为什么重写equals()就一定要重写hashCode()方法?

对于对象集合的判重,如果一个集合含有10000个对象实例,仅仅使用equals()方法的话,那么对于一个对象判重就需要比较10000次,随着集合规模的增大,时间开销是很大的。但是同时使用哈希表的话,就能快速定位到对象的大概存储位置,并且在定位到大概存储位置后,后续比较过程中,如果两个对象的hashCode不相同,也不再需要调用equals()方法,从而大大减少了equals()比较次数。 所以从程序实现原理上来讲的话,既需要equals()方法,也需要hashCode()方法。那么既然重写了equals(),那么也要重写hashCode()方法,以保证两者之间的配合关系。

解决hash冲突 3个方法:

• 开放定址法:这种方法也称再散列法,其基本思想是:当关键字key的哈希地址p=H(key)出现冲突时,以p为基础,产生另一个哈希地址p1,如果p1仍然冲突,再以p为基础,产生另一个哈希地址p2,…,直到找出一个不冲突的哈希地址pi ,将相应元素存入其中。这种方法有一个通用的再散列函数形式:• 线性探测再散列:这种方法的特点是:冲突发生时,顺序查看表中下一单元,直到找出一个空单元或查遍全表。• 二次探测再散列这种方法的特点是:冲突发生时,在表的左右进行跳跃式探测,比较灵活。

到此,关于"为什么要重写equals和hashcode"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

方法 对象 哈希 两个 相同 冲突 地址 不同 内存 学习 位置 探测 单元 基础 字段 就是 指向 时间 更多 源码 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 湖北九亚互联网络科技有限公司 互联网科技产业 上海互联网科技有限公司 凡科互联网科技 上游互联网科技 广西拼得多互联网科技有限公司 青海省互联网新科技 科技赋能互联网健康 福州新华互联网科技学校 知乎 南平创想时代互联网科技有限公司 苏州五指互联网络科技有限 天津腾达互联网科技有限公司 互联网公司高科技产品 广州千川互联网科技有限公司 互联网科技品牌 科技互联网专业工作会议发言稿 北京品多多互联网科技有限公司 互联网高科技绘画 互联网科技自媒体灵感 广州全民伙伴互联网科技有限公司 哈尔滨大商圈互联网科技有限公司 圆梦互联网科技 网络科技有限互联网 狮子座互联网科技 互联网巨头投资的硬核科技 华脉科技工业互联网产品 广州慧亚互联网科技怎么样 互联网大会黑科技排名 数字互联网科技有限公司 互联网科技对化妆品行业
0