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

aus*_*ser 12 java equals hashcode

我正在读一篇名为Java理论和实践的文章中引用的段落:哈希 - 有效且正确地定义hashCode()和equals()

定义相等性 Object类有两种方法可以推断出对象的身份:equals()和hashCode().通常,如果覆盖其中一个方法,则必须覆盖它们,因为它们之间必须保持重要的关系.特别是,如果两个对象根据equals()方法相等,它们必须具有相同的hashCode()值(尽管反之通常不正确).[强调我加入]

我的问题涉及该段的后一部分"虽然反过来通常不正确".如何让一个类的两个不同实例具有相同的hashCode但不相等?

Zoh*_*aib 17

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

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


Roh*_*ain 5

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

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

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

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

当然,根据某些属性,一个存储桶可能包含多个对象。


Che*_*wda 5

将哈希码视为只是减少检查相等性的工作量的东西。如果两个对象相等,它们肯定具有相同的哈希码。但是,如果两个对象具有相同的哈希码,它们可能在数学上具有很高的相似性,但仍然不相同。只是为了心态:想象一下将鸭子与动物园里的大象进行比较。它们非常不同,并且具有不同的抽象哈希码,因此您不必费心比较它们的腿、翅膀等来检查它们是否相同。但是,如果您要比较鸭子和天鹅,它们非常相似并且具有相同的抽象哈希码,因此现在您需要比较每种动物的非常微小的特征以检查是否相等。当您减少比较的两个元素之间的极端性时,抽象哈希码变得越来越具体。就像比较鸭子和天鹅比比较鸭子和大象有更具体的哈希码一样,比较不同品种的鸭子使哈希码更加具体,比较同一品种的两只鸭子的 DNA 使哈希码更加具体。这个答案只是为了创建一种理解哈希码概念的心态。读完本文后,您必须模糊对这个答案上下文中的哈希码一词的理解。