2012-11-26 52 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他們應該是相等的。但它並不總是會發生,因爲它們不是一個完美的散列函數,它會將不同的散列分配給不同的對象。

由於散列衝突,不同的對象可以具有相同的散列碼。

但有兩個對象是等於應該有相同的哈希碼