【问题标题】:Override hashCode-method in Java: Why does it work? [duplicate]在 Java 中覆盖 hashCode-method:为什么它会起作用? [复制]
【发布时间】:2014-04-19 13:22:06
【问题描述】:

我已经为我的班级覆盖了哈希码方法(使用一个名为“id”的实例变量)。

public int hashCode()
{
  final int prime = 31;
  int result = 1;

  result = prime * result + ((id == null) ? 0 : id.hashCode());
  return result;
}

最后一行到底发生了什么?应该有两种不同的情况:

案例1:id == null,表示结果应该等于31。

案例2:id != null ,表示结果应该等于31 + id.hashCode();

我不明白这两种情况(或者我什至不确定它们是否正确)。无论如何,质数的意义是什么?为什么要将空引用分配给 31?

【问题讨论】:

标签: java overriding primes hashcode


【解决方案1】:

质数的意义何在? 31 是 ODD-PRIME 数,选择奇数可防止乘法溢出,而素数是一种传统方法。

我认为这部分可以从here更详细地理解

为什么要把空引用赋值给 31

((id == null) ? 0 : id.hashCode()) 在这里,我们正在检查 id 是否具有非空值。如果有一些非空值,那么它一定有一些哈希码,我们正在将那个哈希码添加到我们对象的哈希码中。 这样你就可以得到two object will differ if id for those two object differs 的哈希码了。

【讨论】:

  • 但为什么我需要 31?我已经阅读了所有内容,但我不明白。我不能只使用 id.hashCode();为什么要乘以 31?如果 id 的哈希码是唯一的,如果我们将它与数字相乘,它仍然是唯一的,不是吗?
  • 是的,如果你去掉乘以 31,那么哈希码也是唯一的。但为了效率,我们需要将其乘以奇数。
  • 那为什么效率更高?
  • 这是我直接从源中挑选的,你建议 ub 评论“选择值 31 是因为它是一个奇数素数。如果它是偶数并且乘法溢出,信息将会丢失,因为乘以 2 相当于移位。使用素数的优势不太明显,但它是传统的。“...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-03
  • 2015-01-15
  • 2013-06-11
  • 1970-01-01
  • 2014-10-09
  • 2020-04-15
  • 2011-04-24
相关资源
最近更新 更多