我正在阅读的书中引用Head First Java:
重点是哈希码可以是相同的,但不一定能保证对象是相同的,因为
hashCode()
方法中使用的“哈希算法”可能会为多个对象返回相同的值。
为什么hashCode()
方法可能会为不同的对象返回相同的值?这不会导致问题吗?
答案 0 :(得分:31)
散列对象意味着“找到一个好的,描述性的值(数字),可以一次又一次地由同一个实例再现”。由于来自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。
答案 1 :(得分:26)
只有超过40亿个可能的哈希码(int
的范围),但您可以选择创建的对象数量要大得多。因此,某些对象必须通过pigeonhole principle共享相同的哈希码。
例如,包含来自A-Z的10个字母的可能字符串的数量是26 ** 10,即141167095653376.不可能为所有这些字符串分配唯一的哈希码。也不重要 - 哈希码不需要是唯一的。它只需要对真实数据没有太多冲突。
答案 2 :(得分:16)
答案 3 :(得分:2)
hashCode()值可用于通过使用哈希码作为存储它的哈希表桶的地址来快速查找对象。
如果多个对象从hashCode()返回相同的值,则意味着它们将存储在同一个存储桶中。如果许多对象存储在同一个存储桶中,则意味着平均而言需要更多的比较操作才能查找给定的对象。
而是使用equals()来比较两个对象,看它们在语义上是否相等。
答案 4 :(得分:0)
据我所知,hashcode方法的工作是创建用于散列元素的存储桶,以便检索更快。如果每个对象都返回相同的值,则不进行任何散列。
答案 5 :(得分:-2)
我必须认为这是一个非常低效的哈希算法,可以让2个对象拥有相同的哈希码。