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

2022-09-02 02:13:38

我正在读的书中的一句话 Head First Java

关键是哈希码可以是相同的,而不必保证对象是相等的,因为该方法中使用的“哈希算法”可能碰巧为多个对象返回相同的值。hashCode()

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


答案 1

散列一个对象意味着“找到一个好的,描述性的值(数字),可以一次又一次地由相同的实例复制”。因为 Java 的哈希码是类型,你只能有不同的值。这就是为什么当两个不同的对象产生相同的哈希码时,根据哈希算法,您将遇到所谓的“冲突”。Object.hashCode()int2^32

通常,这不会产生任何问题,因为通常与 一起使用。例如,a 将调用其密钥,以了解密钥是否已经包含在 HashMap 中。如果HashMap没有找到哈希代码,很明显该密钥尚未包含在HashMap中。但是,如果是这样,则必须使用 仔细检查具有相同哈希代码的所有键。hashCode()equals()HashMaphashCode()equals()

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

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

如果 和 已正确实现。equals()hashCode()

有关总协定的更精确描述,请参阅 JavadochashCode


答案 2

只有超过40亿个可能的哈希码(的范围),但你可以选择创建的对象数量要大得多。因此,根据鸽子洞原则,某些对象必须共享相同的哈希代码。int

例如,包含来自 A-Z 的 10 个字母的可能字符串数为 26**10,这141167095653376。不可能为所有这些字符串分配唯一的哈希代码。这也不重要 - 哈希代码不需要是唯一的。它只需要没有太多的真实数据冲突。


推荐