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

首先,这是 Java 规范。为什么要有这样的规范呢?还得从 hash 原理说起。

举个例子。现在有1000个字符串,都是人名,比如Jack、Tom等。最简单的存储方式是,将这1000个字符串存入一个数组里。如果我要查找某个名字,比如 Jack
的位置。假如 Jack 存在于 311 这个位置。那么计算机要找到它,必须得将字符串和 311 之前的每个位置都比较一遍。

那么有没有更高效的方式呢?hash就是一种更高效的方式。这里就要提到数组的一个特点了。在一个数组里,假如我知道 311 这个位置存在 Jack 这个字符串的话,我就可以一步就取出这个字符串。那么,如果能将Jack这种字符串和数组下标通过某种方式映射起来。那么查找效率是不是会变得高效?

比如,如果将 a-z 和 1-26 这些数字映射起来。那么Jack就是J=10,a=1,c=3,k=11.那么Jack = 101311 和 1000 取模为 311。那么我通过这种方式,将 Jack 存在下标为 311 的中。等到取数据的时候,我会根据 Jack 进行运算,得到 311 的这个数字。然后在数组里,一次就能获取这个单元格里面的所有数组,然后通过 equals 方法,来比较是否有 Jack 这个元素。

这里,可以看出 equals 方法和 hashCode 分别做了什么。hashCode就是数组里存储数据的单元格那个下标。equals就是为了比较单元格里是否有目标数据,因为会有 hash 碰撞。所以,重写 equals 需要重写 hashCode。

总之,hash算法是利用数组寻下标访问速度高效的特点。并且将存储的元素和数组下标一一映射起来。来达到高查找效率的目标。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值