具有相同哈希码但不相等的两个实例

2022-09-04 06:33:19

我正在阅读下面引用的一段话,标题为 - Java理论和实践:哈希 - 有效和正确地定义hashCode()和equals()

定义平等Object 类有两种方法用于推断对象的标识:equals() 和 hashCode()。通常,如果重写这些方法之一,则必须重写这两种方法,因为它们之间存在必须维护的重要关系。特别是,如果根据 equals() 方法,如果两个对象相等,则它们必须具有相同的 hashCode() 值(尽管相反的情况通常不成立)。[着重号由我补充]

我的问题涉及该段的后一部分,“尽管相反的情况一般不是真的”。一个类的两个不同实例怎么可能具有相同的哈希码但不相等?


答案 1

简单来说,哈希码()是通过某种公式生成哈希的函数,因此可能存在一些冲突,两个不同的值可以具有相同的哈希码。

如果我只是通过采用mod 6来计算哈希码,那么两个不同的值可能具有相同的哈希码。


答案 2

您可以考虑..hashes to be a bucket

  • 如果两个对象相等,它们将进入同一存储桶(具有相同的哈希码)
  • 但是,如果两个对象进入同一个桶(具有相同的哈希码),这并不意味着它们必须相等
  • 另请注意,如果两个对象不相等,即使这样,它们也可以具有相同的哈希代码。显然,这是从以上两点推断出来的。

因此,哈希码只不过是该存储桶的哈希值。任意数量的对象都可以具有相同的哈希码,具体取决于用于计算哈希码的算法。

理想的算法是为不同的对象生成不同的哈希码的算法。因此,理想情况下,每个..当然,这是完美的情况,这可能是不可能的。1 objectbucket

一个存储桶当然可能包含基于某些属性的多个对象。


推荐