为什么hashCode()可以为Java中的不同对象返回相同的值?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (19)

来自这本书的引用我正在阅读Head First Java

重点是hashcodes可以是相同的,而不必保证对象是相等的,因为hashCode()方法中使用的“散列算法” 可能碰巧返回多个对象的相同值。

为什么该hashCode()方法可能为不同的对象返回相同的值?这不会导致问题吗?

提问于
用户回答回答于

“hashing”一个对象意味着“找到一个好的,描述性的值(数字),可以一次又一次地重现”。因为Java的Object.hashCode()中的散列码是int类型的,所以只能有2 ^ 32个不同的值。这就是为什么当两个不同的对象产生相同的hashCode时,根据散列算法会有所谓的“冲突”。

通常,这不会产生任何问题,因为hashCode()主要与equals()一起使用。例如,一个HashMap将在其键上调用hashCode(),以知道这些键是否已经包含在HashMap中。如果HashMap没有找到哈希码,很明显这个关键字还没有包含在HashMap中。但是如果是这样,它将不得不使用equals()来检查具有相同散列码的所有密钥。

A.hashCode() == B.hashCode() // does not necessarily mean
A.equals(B)

A.equals(B) // means
A.hashCode() == B.hashCode()

如果equals()hashCode()正确实施。

有关总hashCode合同的更详细描述,请参阅Javadoc

用户回答回答于

只有超过40亿个可能的哈希码(an的范围int),但是您可以选择创建的对象的数量要大得多。因此,一些对象必须共享相同的哈希码,按照鸽子的原则。

例如,包含来自AZ的10个字母的可能字符串的数目是26 ** 10,即141167095653376.不可能将所有这些字符串分配一个唯一的哈希码。这也不重要 - 散列码不需要是唯一的。它只需要不会有太多的实际数据冲突。

扫码关注云+社区