为啥要同时重写equals和hashCode方法
什么是哈希值
Java的哈希值可以理解成一种对象(大空间)的编码(小空间),就是一种大空间经过哈希算法为小空间的映射。默认是根据jvm虚拟出来的地址值(并不是实际的物理地址)经过哈希算法散列得来的,这也是hashCode方法的默认实现。重写的就会根据对象的属性进行哈希算法得到。说法可能偏向主观,客观的可以百度百科。
提示:本文仅理论知识的理解,仅供参考,有不正确之处请指出,谢谢!
哈希值有啥用?
我的理解就是哈希值的用途就是用来区分对象,查找对象。最明显最要的运用就是键值对集合中的key查找。
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
为啥必须同时重写
为什么对象重写equals()之后还要重写hashCode()?是前者依赖后者呢还是后者依赖前者?只重写单独的某一项可以吗?谈谈我的主观理解。文字有点枯燥,希望耐心观看。
首先哈希值的主要运用就是在集合里进行key对象的区分,所以就拿集合的哈希表来说:Object的哈希值默认实现就是通过虚拟地址得来的,equals()方法默认实现也是比较地址。我们都知道两个对象的地址是不可能相等的,所以我们不重写的话只能传入存入的key对象的引用才能找到对应的key对象存储位置,成功找到value,但是我们多数时候都是传入一个新的相同对象内容的key来查找value,这不就找不到了嘛?所以就要重写hashCode()方法来根据对象内容进行哈希,但是又有一个新的问题:不同的对象经过哈希函数散列得来的哈希值也有可能相同。这就是哈希冲突现象。所以只重写hashCode方法就会出现通过哈希值找到存在哈希冲突的对象,他们的哈希值都相同,我找的是哪个啊?懵了吧?所以现在就是equals()登场了,比较下哪个和我传入的key的内容相同呗。但是不重写equals()比较地址的话,那不也是个睁眼瞎嘛,所以这就是重写equals()的作用。对于重写这件事,不存在谁单独依赖谁,都是在解决提升性能的这件事上相互依赖。