【问题标题】:Overriding hashCode() in eclipse- Java [duplicate]在 eclipse-Java 中覆盖 hashCode() [重复]
【发布时间】:2013-06-11 01:40:00
【问题描述】:

每当我使用 eclipse 'source' 菜单覆盖 hashcode() 时,它都会在类中生成以下代码

final int prime = 31;
int result = 1;
result = prime * result + ((fieldName1== null) ? 0 : fieldName1.hashCode());
result = prime * result + ((fieldName2== null) ? 0 : fieldName2.hashCode());

谁能解释一下为什么它要进行所有这些计算(乘法然后加法),为什么它没有简单地返回

fieldName.hashCode();
or
fieldName2.hashCode();

?

【问题讨论】:

  • 尝试在你的类中包含两个或更多字段,然后生成并查看会发生什么。
  • @Zavior 这不是重复的,因为在其他问题中被问到为什么不使用 XOR。这里问为什么要用计算来创建hashCode
  • 很公平,那里的第一个答案也确实回答了这个问题:P
  • @darijan 我的班级有 15 个字段我在这里只放了一段代码,因为为了便于阅读,虽然我在这里放了两个字段。

标签: java jakarta-ee overriding hashcode


【解决方案1】:

乘以减少collisions

请阅读Joshua Bloch

选择值 31 是因为它是一个奇数素数。如果它是偶数并且乘法溢出,则信息将丢失,因为乘以 2 相当于移位。使用素数的优势不太明显,但它是传统的。 31 的一个很好的特性是乘法可以用移位和减法代替以获得更好的性能:31 * i == (i

【讨论】:

  • 这并没有回答他的问题
  • 好的,我知道选择了 y '31',但我问为什么我们需要做(或 y IDE 生成)“所有”这个计算。请阅读问题以供参考。
  • 通过乘法,位左移,使用更多的哈希码可用空间,减少冲突。
  • 正如新白痴所说:它减少了碰撞
【解决方案2】:

说明here

基本上,您在乘法中使用素数来更好地分布散列值。然后HashSetHashMap 工作得更好,因为它们根据哈希值进行分配。并且散列值分布不均会导致很多冲突。

【讨论】:

    【解决方案3】:

    为什么它没有简单地返回 fieldName.hashCode(); 要么 fieldName2.hashCode();

    要了解原因,您还必须检查equals() 的实现并了解hashCode() 实现的约束。

    1. hashCode() 实现必须为比较相等的对象返回相等的值:if x.equals(y) then x.hashCode() == y.hashCode()

    2. 一个hashCode()实现应该很少为不相等的对象返回相同的哈希码:如果!x.equals(y)然后经常@987654330 @。

    3. Eclipse 生成的equals() 实现同时检查fileName1filename2。如果两个对象中的任何一个不同,则该方法将认为这两个对象不等价。

    4. 因此,如果fileName1 fileName2 不同,则相应的good hashCode() 实现应该产生不同的哈希码值。

    5. 因此对应的good hashCode() 实现应该使用fileName1.hashCode() fileName2.hashCode()

    【讨论】:

      猜你喜欢
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-20
      • 1970-01-01
      • 2020-06-09
      • 1970-01-01
      相关资源
      最近更新 更多