当前位置: 首页 > 网络应用技术

如何正确重写HashCode()?

时间:2023-03-06 16:42:40 网络应用技术

  我不知道您是在开发过程中重写了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吗?

  绝对不是这样!该产品只是减少哈希冲突的解决方案。当您无法使用它时,您不需要使用产品的产品!