2012-07-30 80 views
4

我在java中使用HashMap來存儲密鑰和Object <Key,Object>。我讀了關於hashmap碰撞,我試圖通過使用鏈表來避免它。HashMap避免衝突的Java示例

我做了一些在線搜索,但我找不到一個示例如何做到這一點。

有人可以指向我的在線資源,實現散列表與鏈接列表?

+0

重載hashCode()的equals(哈希算法?我們不是在做太多的分析(除非你正在編寫科學應用程序)。 – kosa 2012-07-30 18:58:14

+3

好吧,如果你擔心因碰撞而使用HashMap,不要這麼做。它照顧你的一切。 – nos 2012-07-30 18:58:20

+0

HashMap已經使用鏈表。它也會對你的hashCode進行置換,所以如果它不是很好的話,它就很重要。 – 2012-07-30 20:50:33

回答

5

Java HashMap已經以這種方式爲您處理衝突。所有你需要做的是確保你重寫和實現密鑰的方法hashCode()equals()

每個hash code將映射到一個特定的「桶」。每個桶包含一個碰撞情況下的鏈表。

,以避免(或更確切地說最小化)碰撞的唯一方法是創建一個用於創建值的整個HashMap中的最佳可能分佈的哈希函數。根據你的HashMap的密度和你的hash code的質量,碰撞幾乎是不可避免的,因此需要重寫這兩種方法。

編輯:該任擇議定書要求的例子

要覆蓋兩個方法:

public class MyObject { 
    String var1; 
    int var2; 

    //... 
    public boolean equals(Object obj) { 
    if(obj == null) return false; 
    if(this == obj) return true;  // Reference equality 
    if(!(obj instanceof MyObject)) return false; 
    MyObject myObj = MyObject(obj); 
    return (var1.equals(myObj.var1)) && (var2 == myObj.var2); 
    } 
    public int hashCode { 
    return var1.hashCode()^var2; 
    } 
} 
+0

感謝您的信息。我的下一個問題是如何重寫這兩個方法,我真的壓倒一切? – Tony 2012-07-30 19:29:32

+0

@Tony:我用一個非常一般的例子更新了我的回覆。 – 2012-07-30 19:41:35

3

碰撞只有當你使用相同的object爲重點,或不同object與鍵發生相同的哈希碼。

如果你想存儲的關鍵不止一個對象,你應該創建列表

這是一個簡單的例子是一個HashMap:用最好的)

HashMap<Object, List<Object>> map = new HashMap<Object, List<Object>>(); 
map.put(key, new LinkedList<Object>); 
map.get(key).add(object); 
+1

*「碰撞只發生在使用相同的鍵時。」*不是真的,它發生在2個不同的對象具有相同的hascode時。 – assylias 2012-07-30 19:06:50

+0

你是對的,但我給出了最簡單的答案,因爲這個問題是由一個初學者做出的 – Victor 2012-07-30 19:47:01

+0

這叫做一個Multimap。人們可以使用Google Guava框架中的Multimap實現來執行相同的功能,而不是重新發明輪子。 – icfantv 2016-03-15 18:12:57