为什么要重写hashcode和equals方法

1、hashcode

1.1 什么是hashcode

简而言之,把任意长度的输入通过hash算法变换成固定长度的输出,该输出就是hashcode。

比如    输入a  ----->  算法计算  ------>  输出1,这个1就是hashcode。

1.2 hashcode有什么用

一定程度的快速去重。

思考一下如何实现将一组数据去重,存入容量为一百的数组?

如果按照常规的思路去重,我们会将这组数据的值逐个放入数组,并且放入的时候,我们需要拿这个值跟数组中已有的每一个值进行对比,如果没有相同的,就说明没有重复的。

实际上这种逐个比较的思路效率比较低。

现在我们换个思路:

我们采用一种算法,任何输入字符,经过算法计算后,均会输出一个值。任何输出也只会对应一个之输出值。

那么,如果输出的值不一样,我们就可以判定输入的值一定不同。

那么如何利用这个输出的值来进行存储和快速去重呢?

其实我们可以直接用这个值对数组长度求余,得到的值就是这个字符所存位置的下标。如果两个输入的经过计算后得到的下标不同,那么它们一定是不同的,这就实现了快速去重的目的。

那么,如果两个输入的下标相同,它们一定是相同的么?

答案是否定的,比如我们输入101个不同的字符,那根据输出得到的下标至少会存在两个相同的下标。这种情况就是hash冲突,在此就不再展开了。

总而言之,hashcode是将输入用hash算法计算得到的值。hashcode不同,输入一定不同,hashcode相同,输入不一定相同。

2、hashcode和equals方法

set等数据结构进行存储的时候,会先采用hashcode初步判断对象a和对象b是不是相同。

  • 如果对象a和对象b的hashcode不相同,那么它们一定是不同的。
  • 如何对象a和对象b的hashcode相同,那么它们可能是不同的。这种情况就需要采用equals方法进一步判断对象a和对象b是否相同。

如果只重写equals,去根据对象的值判断对象是否相。但是hashcode的计算却不是依据对象的值,那么就会出现对象a和对象b的值相同,但是它们的hashcode可能不相等的情况。

存储的时候,系统在初步判定阶段就会判定对象a和对象b不重复,也就不会进一步采用equals判断对象是否相同,从而导致数据错误。

因此需要重写equals时,也要重写hashcode方法。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值