hashcode和equals contract反之亦然

Fra*_*nkD 1 java equals hashcode

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

Roh*_*ain 6

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

不,它不应该.这是因为,每当一个对象被搜索时,让我们在a HashMap或a中说HashSet,然后首先搜索它hashCode(注意: - hashCode()不用于搜索ArrayList,或者LinkedList.它们不是hash based集合),然后如果两个对象具有相同的哈希码,它移动到equals方法来比较对象本身.

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

现在让我们转到第二个声明: -

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

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


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

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

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


Lou*_*man 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
}
Run Code Online (Sandbox Code Playgroud)