为什么重写equals时必须重写hashCode⽅法?
hashCode()与 equals()
⾯试官可能会问你:“你重写过hashcode和equals么,为什么重写equals时必须重写hashCode⽅法?”
1)hashCode()介绍:
hashCode()的作⽤是获取哈希码,也称为散列码;它实际上是返回⼀个 int 整数。这个哈希码的作⽤是确定该对象在哈希表中的索引位
置。hashCode()定义在 JDK 的Object类中,这就意味着 Java 中的任何类都包含有hashCode()函数。另外需要注意的是:Object的 hashcode ⽅法是本地⽅法,也就是⽤ c 语⾔或 c++ 实现的,该⽅法通常⽤来将对象的内存地址转换为整数之后返回。
public native int hashCode();
散列表存储的是键值对(key-value),它的特点是:能根据“键”快速的检索出对应的“值”。这其中就利⽤到了散列码!(可以快速到所需要的对象)
2)为什么要有 hashCode?
我们以“HashSet如何检查重复”为例⼦来说明为什么要有 hashCode?
当你把对象加⼊HashSet时,HashSet会先计算对象的 hashcode 值来判断对象加⼊的位置,同时也会与其他已经加⼊的对象的 hashcode 值作⽐较,如果没有相符的 hashcode,HashSet会假设对象没有重复出现。但是如果发现有相同 hashcode 值的对象,这时会调⽤ equals()⽅法来检查 hashcode 相等的对象是否真的相同。如果两者相同,HashSet就不会让其加⼊操作成功。如果不同的话,就会重新散列到其他位置。(摘⾃我的 Java 启蒙书《Head fist java》第⼆版)。这样我们就⼤⼤减少了 equals 的次数,相应就⼤⼤提⾼了执⾏速度。
3)为什么重写equals时必须重写hashCode⽅法?
如果两个对象相等,则 hashcode ⼀定也是相同的。两个对象相等,对两个对象分别调⽤ equals ⽅法都返回 true。但是,两个对象有相同的hashcode 值,它们也不⼀定是相等的。因此,equals ⽅法被覆盖过,则hashCode⽅法也必须被覆盖。
equals()方法
hashCode()的默认⾏为是对堆上的对象产⽣独特值。如果没有重写hashCode(),则该 class 的两个对象⽆论如何都不会相等(即使这两个对象指向相同的数据)
4)为什么两个对象有相同的 hashcode 值,它们也不⼀定是相等的?
在这⾥解释⼀位⼩伙伴的问题。以下内容摘⾃《Head Fisrt Java》。
因为hashCode()所使⽤的杂凑算法也许刚好会让多个对象传回相同的杂凑值。越糟糕的杂凑算法越容易碰撞,但这也与数据值域分布的特性有关(所谓碰撞也就是指的是不同的对象得到相同的hashCode。
我们刚刚也提到了HashSet,如果HashSet在对⽐的时候,同样的 hashcode 有多个对象,它会使⽤equals()来判断是否真的相同。也就是
说hashcode只是⽤来缩⼩查成本。
更多关于hashcode()和equals()的内容可以查看:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。