你真的知道为啥重写equals()就要重写hashCode()吗

为啥要同时重写equals和hashCode方法


什么是哈希值

Java的哈希值可以理解成一种对象(大空间)的编码(小空间),就是一种大空间经过哈希算法为小空间的映射。默认是根据jvm虚拟出来的地址值(并不是实际的物理地址)经过哈希算法散列得来的,这也是hashCode方法的默认实现。重写的就会根据对象的属性进行哈希算法得到。说法可能偏向主观,客观的可以百度百科。


提示:本文仅理论知识的理解,仅供参考,有不正确之处请指出,谢谢!

哈希值有啥用?

我的理解就是哈希值的用途就是用来区分对象,查找对象。最明显最要的运用就是键值对集合中的key查找。

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

为啥必须同时重写

为什么对象重写equals()之后还要重写hashCode()?是前者依赖后者呢还是后者依赖前者?只重写单独的某一项可以吗?谈谈我的主观理解。文字有点枯燥,希望耐心观看。

首先哈希值的主要运用就是在集合里进行key对象的区分,所以就拿集合的哈希表来说:Object的哈希值默认实现就是通过虚拟地址得来的,equals()方法默认实现也是比较地址。我们都知道两个对象的地址是不可能相等的,所以我们不重写的话只能传入存入的key对象的引用才能找到对应的key对象存储位置,成功找到value,但是我们多数时候都是传入一个新的相同对象内容的key来查找value,这不就找不到了嘛?所以就要重写hashCode()方法来根据对象内容进行哈希,但是又有一个新的问题:不同的对象经过哈希函数散列得来的哈希值也有可能相同。这就是哈希冲突现象。所以只重写hashCode方法就会出现通过哈希值找到存在哈希冲突的对象,他们的哈希值都相同,我找的是哪个啊?懵了吧?所以现在就是equals()登场了,比较下哪个和我传入的key的内容相同呗。但是不重写equals()比较地址的话,那不也是个睁眼瞎嘛,所以这就是重写equals()的作用。对于重写这件事,不存在谁单独依赖谁,都是在解决提升性能的这件事上相互依赖。


总结

相关博客参考:
Java中HashSet中成员属性的修改对HashSet存储方式的影响
Java中hash算法细述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值