彻底搞懂为什么重写equals还要重写hashcode?

article/2025/8/4 8:01:16

引言

原文链接:深入理解equals和hashCode 由于hashCode与HashMap有一定关系,推荐大家看一下我的这篇文章 HashMap源码大剖析 

 

本文介绍java.lang.Object类中的两个方法:equals和hashCode。这两个方法大家应该都知道,但是这两个方法的作用是什么、为什么重写equals还要重写hashCode、它们之间有什么关系和约定等,或许有些小伙伴还不是很清楚,知其然知其所以然,今天就来带大家了解一下。

百度搜索"为什么重写equals一定要重写hashcode",第二条结果就是我写的文章。这是我很久之前写的,其中的内容表述得不太清楚,或多或少难以让人信服,于是我决定再写一篇。

图片

1、hashCode

在阅读下面的内容之前,大家可能需要先了解一下什么是哈希表、哈希函数,这是数据结构相关的知识。

hashCode即散列码。散列码是用一个int值来代表对象,它是通过将该对象的某些信息进行转换而生成的。

Object类中默认的hashCode方法如下。

public native int hashCode();

这是一个本地方法,不同的虚拟机有不同的实现(具体实现自己看虚拟机源码哈)。Object默认的hashCode是根据对象的内存地址转化而来的,它是唯一的。

我们可以在自己的类中覆盖hashCode方法,但我们可以使用System.identityHashCode(Object x)方法返回默认的hashcode,无论对象是否覆盖默认的hashcode。

hashCode方法主要是为了给诸如HashMap这样的哈希表使用

设计hashcode最重要的因素是:对同一个对象调用hachCode()应该产生同样的值(前提是对象的信息没有被改变)。

设计一个hashCode,它必须快,而且具有意义(使用有意义的字段来生成hashcode)。hashCode不需要唯一(默认的hashCode唯一),因此更应该关注它的速度,而不是唯一性

由于在生成桶(桶指哈希桶,或哈希表的槽位)的下标前,hashcode还要做进一步处理,所以生成的hashCode范围不是很重要,是int就行。

好的hashCode()应该产生分布均匀的散列码。

哈希桶的大小最好是2的n次方。

  • 对现代处理器来说,除数和求余是最慢的操作,而使用2的n次方,可以用位运算代替求余(%开销较大)。

  • 举个例子,假设哈希桶大小为16(HashMap初始大小),假设hashCode为20,那么使用%求余会得到下标4;但这可以用hashCode&(length-1)代替,即20&(16-1),结果也是4。

2、equals

hashCode并不需要唯一性,但equals必须严格地判断两个对象是否相同。

正确的equals方法有如下特性:

  • 自反性:x.equals(x)一定返回true

  • 对称性:如果x.equals(y)为true,那么y.equals(x)也为true

  • 传递性:如果x.equals(y)为true、y.equals(z)为true,那么x.equals(z)也为true

  • 一致性:如果x和y中用于等价比较的信息没有改变,那么x.equals(y)无论调用多少次,结果都一致

  • 任何不是null的x,x.equals(null)一定返回false

3、equals与hashCode的相关规定

之所以有规定,是为了使诸如HashMap这样的哈希表正常使用。具体规定如下:

  1. equals相等,hashcode一定相等。

  2. equals不等,hashcode不一定不等。

  3. hashcode不等,equals一定不等。

  4. hashcode相等,equals不一定相等。

因此,如果我们重写了equals,那么必须重写hashCode,使其满足这些规定。当然,如果我们不把自定义对象当成HashMap的键来使用,那么自定义对象不重写equals和hashCode也是可以的。

下面来详细解释一下,为什么这些规定能让HashMap正常工作。

3.1、equals相等,hashCode一定相等

因为HashMap是用equals判断键是否相等的,用反证法,如果两个键 equals相等,而hashcode不等的话,那么就无法保证通过hashcode计算的下标值相等,下标值不等也就意味着相等的两个键却 到了不同的值,这肯定是不对的。

3.2、equals不等,hashcode不一定不等

equals不等,一般hashcode也不相等,这是为了尽量减少哈希冲突。但为啥会出现相等的情况呢,因为hashcode是int类型,是有范围的,当数据量很大的情况下,难免会发生冲突,此时HashMap通过拉链法解决冲突。

当从map中获取equals不等的两个键时,由于它们的hashcode相同,所以计算到的下标值也相同,当定位到同一个桶位时,会在单链表上顺序查找,查找到的依据就是要查找的键与单链表上的键equals相等。

3.3、hashcode不等,equals一定不等

这个相当于规定1的逆反命题。

3.4、hashcode相等,equals不一定相等

这个相当于规定2的逆反命题。如果两个键hashcode相等,那么计算到的下标值是相同的,这时候两个键可能是相等的(该桶位有一个元素),也可能是不等的(该桶位有两个元素)。


http://chatgpt.dhexx.cn/article/fsdshSs4.shtml

相关文章

Java方法的重写

一、 方法的重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写,返回值和形参都不能改变。 重写的好处在于子类可以根据需要,定义特定属于自己的行为。也就是说子类能够,根据需要实现父类的方法。…

方法的重写

方法的重写和super关键字 1、重写: 在Java和其他一些高级面向对象的编程语言中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方…

Java方法之重写

方法的重写是学习java面向对象过程中一个极其重要的知识点。那么什么叫方法的重写呢?举个例子(再次摆上使用了多次的老图):              博主毕业后,终于继承了家里面的一笔巨额财产:一辆奇瑞…

为什么重写equals一定要重写hashcode?

引言 这篇文章已经是我很久之前写的,其中的内容表述得不太清楚,或多或少难以让人信服,于是我又写了一篇,链接如下: CSDN链接:彻底搞懂为什么重写equals还要重写hashcode? 微信公众号链接&…

详述重写

1、什么是重写 重写即重新改写,是为了将一个已有的事物进行某些改变以适应新的要求 2、为什么要重写 方法使用的是父类的eat方法,子类继承自父类的eat方法已经不能“准确描述子类自身的行为”,此时就需要用到重写 注:如果父类中…

什么是重写?重写的作用?

一、什么是重写? 1. 重写(Override)概念 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够…

店铺淘客软件定制,1688分销软件OEM贴牌配合精细化运营提升店铺流量

之前做淘宝的有很多人做的是店淘模式,简单来讲店淘模式就是我们开一个淘宝店,然后用软件采集淘宝联盟上的高佣金高销量产品上传到咱们自己的店铺,目前市场上这类软件种类繁多,主要是看软件的功能,安全深度,…

弘辽科技:拼多多的流量从何而来?怎样提升店铺流量?

原标题《弘辽科技:拼多多的流量从何而来?怎样提升店铺流量?》 无论在哪个平台开店,要想商品卖出去,就一定要有要有流量才可以。自然流量对卖家来讲,肯定是最好的,因为不用花钱去做推广。那么,拼多多的流…

弘辽科技:10大手淘推荐流量来源地,快速提升店铺流量

原标题《弘辽科技:10大手淘推荐流量来源地,快速提升店铺流量》 在手淘上面有不少流量都是来自于推荐的,但是这些流量都是来源于哪些呢?商家们肯定对此很是疑惑,对这些“不知来源的流量”很是好奇。接下来就告诉大家这…

分享淘宝如何提升免费流量 附疫情期间遇到的一些店铺问题

大家保护好自己不给祖国添麻烦!出门戴口罩,勤洗手,少去人群聚集处。疫情期间很多人都不知做什么,有很多喜欢淘宝在做的时候去碰到了一堆问题如:铺流量下滑,或者标题修改流量降低,提升店铺流量办法等等很多,…

店铺自然流量是什么?如何提升其自然流量

我们常说,互联网时代流量为王。那么自然流量是什么?是线上的客流,获取流量,才能获取消费者;但自然流量不是最关键的,如何转化流量才是关键。本文带你分析分析自然流量及其转化问题,以及如何提升…

Shopee Man多店铺运营管理工具教你提升印尼Shopee本土店铺流量

现在做Shopee平台,提升店铺流量至关重要,流量在一定程度上能够决定店铺的销量,所以当现在有许多商家入驻东南亚地区最具潜力的电商市场印尼站时,就会从提升店铺流量这方面下功夫,那么想要提升Shopee印尼站的店铺流量&a…

Lazada Feed可行性在于提升Lazada店铺流量的工具之一

Lazada发展迅速,成为了跨境电商引领者之一。Lazada平台也越来越重视内容营销发展。Lazada有Feed的内容方式,可以助力卖家进行一个营销推广的作用,达到促进销量增长的效果。 Lazada Feed可以理解为淘宝的微淘,是卖家通过发布互动帖…

提升eBay店铺流量的方式有哪些?

对很多淘宝ebay卖家来说,也希望能够做好店铺的站外推广,但是也有很多的方式,我这就来给各位卖家们详细介绍一下,另外也要了解一下推广到底需要多久才有效果。 1、Facebook广告 Facebook广告作为全球最大的社交平台,自然…

成都榆熙:商家怎样提升店铺自然流量?

越来越多的商家都开始入驻拼多多,而盲目跟风开店是不可行的,多多少少都需要有一些开店经验和对拼多多的了解,那么如果拼多多店铺一直没有自然流量怎么办呢?一起来和成都榆熙小编来看看吧。 一、什么是拼多多自然流量?…

速卖通店铺流量下滑什么原因,如何做提升?(测评补单)

速卖通作为阿里巴巴未来国际化的重要战略产品,已成为全球最活跃的跨境电商平台之一,并依靠阿里巴巴庞大的会员基础,成为目前全球产品品类最丰富的平台之一。 近期有朋友问我,速卖通店铺开了几个月,店铺流量一直都是稳定上升状态,可是不知道怎…

新手店铺如何稳定提升流量? 精细化运营带你提升店铺权重

现在随着电商行业的发展,越来越多的人会选择淘宝开店,选择做无货源模式。这个模式也已经火了两三年了,做的人也很多,但是做的好的人却是寥寥无几。原因在哪?主要还是不会操作方法。所以想做好这个无货源店铺,方法很重要。 那么到底有多少人真正理解它到底是做什么的,怎…

亚马逊、Lazada卖家如何做测评自养号和提升店铺流量

店铺销售额等于店铺流量乘以转化率乘以客户单价。因此,流量在每个平台都非常的重要。如果店铺的流量足够好,就能获得更大的销售可能。那么,如何改善和提升Lazada的店铺流量呢? 接下来就说说怎么来提升流量。 一.产品流量 产品层…

弘辽科技:淘宝如何提升店铺流量?需要准备什么?

对于淘宝商家来说,流量非常的重要。很多淘宝商家也都选择在淘宝上开店,但是在一段时间后,发现店铺完全没有流量,面对这样的情况,应该如何去补流量呢?下面进行介绍哦。 淘宝如何提升店铺流量? 对…

速卖通、阿里国际如何提升店铺流量?如何安全测评?

卖家在开店后,最关心的就是店里的销售情况。买家如果看到店里的商品销售评价多了,就会觉得该商品比较好,受多数买家欢迎,就会考虑下单。 怎样提高速卖通的店铺流量? 第一,自然搜索流量。为了有效地提升渠…