hashcode和equals contract反之亦然

时间:2012-11-26 17:48:01

标签: java equals hashcode

我知道合同说“如果两个对象相等,那么它们应该返回相同的哈希码”。这样就可以将这些对象放在同一个哈希桶中并改进哈希码相关的集合函数。然后再说明为什么“如果两个对象具有相同的哈希码,则不应总是等于”。我的意思是如果在合同中它是真的,我们应该说“如果两个对象是等于它们可能返回相同的哈希码,但这不是强制性的”

6 个答案:

答案 0 :(得分:6)

  

我的意思是如果在合同中它是真的,我们应该说“如果两个对象是等于它们可以返回相同的   哈希码,但不是强制性的“

不,它不应该。这是因为,无论何时搜索对象,都可以在HashMapHashSet中进行搜索,然后首先根据hashCode进行搜索(注意: - hashCode()或ArrayList的情况下,> LinkedList不用于搜索。它们不是hash based个集合,然后如果这两个对象具有相同的哈希码,则会移动使用equals方法来比较对象本身。

现在假设如果上面的陈述是真的,那么第一个测试本身就会失败。也就是说,如果允许两个相等的对象具有不同的哈希码,那么在搜索特定的hashCode时,它将不会返回正确的结果,因此测试将不会进入equals method,并将这些对象声明为即使你期望它们是平等的,也要unequal

现在让我们转到第二个语句: -

  

如果两个对象具有相同的哈希码,那么它们不应总是等于“

让我们理解为: - 由于为每个对象生成的hashCode属于int类型,因此您可以生成最大2 ^ 32个唯一hashcodes。所以,想象如果你想存储更多的对象会发生什么。在这种情况下,two different objects必须有 collison 。因此,除了将相同的hashCodes分配给两个不同的对象之外,别无他法。因此上述陈述是合理的。


因此,从上面的解释中可以清楚地看到两件事: -

  • 两个相同的对象必须具有相同的hashCodes。
  • 两个不同的对象可以具有相同的hashCodes。

以下链接中有关此主题的更多详细信息(没有比此更好的解释): -

答案 1 :(得分:5)

不。文档是正确的,你们正在混淆。

  • 两个相等的对象必须具有相同的哈希码。
  • 两 具有相同哈希码的对象可能不相等。
  • 为了这个缘故 对于散列表性能,您通常需要两个的对象 等于尽可能多地使用不同的哈希码。

例如,以下内容始终是hashCode()的有效实现:

public int hashCode() { 
  return 0;
  // clearly all equal objects have the same hash code -- 0
  // but it's totally okay that unequal objects also have the same hash code
}

答案 2 :(得分:2)

每个存储区HashMap可以存储多个条目,选择哪个存储区取决于哈希码。 HashMap使用hashcode()标识存储桶,然后equals()查找该存储桶中的匹配密钥,从而找到密钥的条目。

鉴于上述情况,应该清楚的是,您可以使用重复的哈希码,几乎没有问题(如果多个对象具有相同的哈希码但它仍然有效,它会影响HashMaps的性能

答案 3 :(得分:0)

如果2个相同的哈希码必须来自同一个对象,那么哈希就不会那么安全。在技​​术上可以根据哈希来计算密码是什么。这会破坏哈希码的目的(至少在安全意义上。)

对于非安全性散列,如果您可以使每个唯一值创建一个唯一的散列,那么您将解决未解决的计算问题。

答案 4 :(得分:0)

哈希函数通常是

  

单向函数

:某些输入值(对象)可能会生成相同的哈希码。

答案 5 :(得分:0)

基本上说如果两个对象具有相同的哈希码,则应该相等。但是,情况并非总是如此,因为没有(完美)散列函数总是将不同的散列分配给不同的对象。

由于哈希冲突,不同的对象可以具有相同的哈希码。

相等的两个对象应具有相同的哈希码