2012-11-26 51 views
1

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

+5

两个相同的苹果应该花费相同的,这是1金币。然而,两个花费1个金币的物品不一定是相同的苹果。 –

回答

6

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

不,它不应该 。这是因为,当一个对象被搜索,让我们在HashMapHashSet说,那么先搜索它的hashCode的基础上(注: - 。hashCode()不用于在ArrayList,或LinkedList病例检索它们不hash based集合),然后如果两个对象具有相同的散列码,它移动到equals方法来比较对象本身。

现在假设,如果上述声明是真实的,第一个测试本身会失败的那些对象。也就是说,如果两个相等的对象可以有不同的哈希码,然后在搜索特定的hashCode,它不会返回正确的结果,因此,测试将不再继续equals method,并宣布这些对象是unequal即使你期望他们是平等的。

现在让移动到第二声明: -

如果两个对象具有相同的散列码那些不应该总是等于”

让我们这样理解: - 由于hashCode产生每个对象是int型的,因此您可以产生的最大2^32独特hashcodes。所以,想象一下,如果你想存储比这更多的对象会发生什么。在这种情况下,必须有一个collison for two different objects。所以,除了将相同的hashCodes分配给两个不同的对象外,没有别的办法。因此上述说法是有道理的。


所以,两件事从上面的解释很清楚: -

  • 两个相同的对象必须有相同的哈希码。
  • 两个不同的对象可以有相同的哈希码。在下面的链接这一主题

更多详细资料(没有什么可以给比这更好的解释): -

+0

我写了一个示例程序来测试你提到的内容。我只覆盖A的equals方法,而不是哈希码。 但以下返回true。你能解释一下怎么出来真正retrns,因为我有 永远不会为列表添加a3,正如你所提到的那些对象有不同的哈希码和 ,因为在列表中找不到a3哈希码,它应该返回错误的权利? A a1 = new A(); a1.setName(“a”); A a2 = new A(); a2.setName(“a”); A a3 = new A(); a3.setName(“a”); List list = new ArrayList(); list.add(a1); list.add(a2); \t \t System.out.println(list.contains(a3)); – FrankD

+0

抱歉格式不正确。我不能格式化评论 – FrankD

+0

@HarshanaD ..对不起,没有提及'hashCodes'不用于搜索的情况下'列表'。它用于Maps - 'HashMap','LinkedHashMap','Hashtable'或'HashSet'。这就是它工作的原因。我相应地编辑了我的答案。 - 我的答案的第一部分。 –

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 
} 
+0

你想要什么细节? –

0

如果2个相同的散列码必须来自相同的对象,比哈希不会一样安全。在技​​术上可以确定密码基于散列。这会破坏哈希码的目的(至少在安全意义上)。

对于非安全哈希,如果您可以让每个唯一值构成一个唯一哈希值,那么您将解决未解决的计算问题。

1

A HashMap可以存储多个条目每桶,并且选择哪个存储桶取决于散列码。 HashMap通过使用hashcode()来标识存储桶,然后equals()找到该存储桶中的匹配关键字,从而找到关键字的条目。

鉴于上述情况,应该明确的是,你可以有一点问题重复哈希码(它影响HashMaps这样的性能如果多个对象具有相同的哈希码,但一切仍然有效)

0

散列函数通常

单向函数

:某些输入值(对象)可以产生相同的散列码。

0

它基本上是说,如果两个物体有相同的hashCode他们应该是相等的。但它并不总是会发生,因为它们不是一个完美的散列函数,它会将不同的散列分配给不同的对象。

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

但有两个对象是等于应该有相同的哈希码