我不知道您是在开发过程中重写了HashCode方法,还是在访谈中遇到了相关问题。
实际上,这个问题是要回顾程序员对应于哈希码方法的相关知识点。可以看作是hashmap方法的以下put方法屏幕截图,将元素添加到容器中以计算哈希值时,调用了键对象的哈希码方法。
如何正确重写哈希码方法?
这实际上是一个非常普遍且看似简单的问题,但是小的写得很好,看不到很多。
让我们看一下,看看它们不属于编写良好的程序员!
在研究如何重写HashCode方法之前,您必须首先了解何时需要重写哈希码?
关于这个问题,总而言之,只有一个句子:需要重写等价方法的类,所有这些都需要重写哈希码方法!
然后,您肯定会问此时,您什么时候可以重写Equals方法?
我在上一篇有关这个问题的文章中说过。需要它的兄弟可以转到我的专栏“ 100个Java Little Knowledge”系列。顺便说一句,为了订阅,并注意Xiaoyu学习Java而不会迷路!
HashCode方法是Java的Java.lang.Object提供的局部方法。此方法是在JVM中实现的,它可以在内存中返回当前对象。
因此,当我们的班级没有重写HashCode方法时,班级的其余超类也不会重写;然后,当我们调用HashCode方法时,它将始终返回对象的内存地址。这可能不是您想要的结果,我们如何重写它?
首先,我们需要知道我们通过对象的域计算哈希。在对象中,对象中没有数组,参考类型和基本数据类型。有了这么多类型的域,我们绝不能选择某个域的哈希值将其作为实现对象的hashCode方法的返回值。因此,我们考虑域的哈希值的积累!
通用实现是java.util.objects用于计算哈希码的哈希方法。尽管这不是计算哈希码的银炸弹,我们可以从此实现中学习,并且Java JDK源代码中的大多数哈希码相似对于此实现方法!
该方法可以大致分为两个步骤:
其中之一非常引人注目。*当前的结果31每次周期时都会保留。为什么?**
实际上,结果*31的作用是防止哈希冲突!因为如果未设置乘法因子,则结果计算的结果相对较小,并且在累积过程后出现相同的哈希值很容易。这种情况不是我们想要看到的!
那么为什么31?31为什么会是JDK计算团队选择的真正皇帝,不能是2?它不能1001吗?
实际上,将31用作产品因素的使用是有原因的。
xiaoyu使用乘法因子2和产品的乘积在这里进行31测试:
测试总计100,000 15位随机字符串
是否有必要重写HashCode方法,您需要乘以31吗?
绝对不是这样!该产品只是减少哈希冲突的解决方案。当您无法使用它时,您不需要使用产品的产品!