我在java中使用HashMap
來存儲密鑰和Object <Key,Object>
。我讀了關於hashmap碰撞,我試圖通過使用鏈表來避免它。HashMap避免衝突的Java示例
我做了一些在線搜索,但我找不到一個示例如何做到這一點。
有人可以指向我的在線資源,實現散列表與鏈接列表?
我在java中使用HashMap
來存儲密鑰和Object <Key,Object>
。我讀了關於hashmap碰撞,我試圖通過使用鏈表來避免它。HashMap避免衝突的Java示例
我做了一些在線搜索,但我找不到一個示例如何做到這一點。
有人可以指向我的在線資源,實現散列表與鏈接列表?
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;
}
}
感謝您的信息。我的下一個問題是如何重寫這兩個方法,我真的壓倒一切? – Tony 2012-07-30 19:29:32
@Tony:我用一個非常一般的例子更新了我的回覆。 – 2012-07-30 19:41:35
碰撞只有當你使用相同的object
爲重點,或不同object
與鍵發生相同的哈希碼。
如果你想存儲的關鍵不止一個對象,你應該創建列表
這是一個簡單的例子是一個HashMap:用最好的)
HashMap<Object, List<Object>> map = new HashMap<Object, List<Object>>();
map.put(key, new LinkedList<Object>);
map.get(key).add(object);
重載hashCode()的equals(哈希算法?我們不是在做太多的分析(除非你正在編寫科學應用程序)。 – kosa 2012-07-30 18:58:14
好吧,如果你擔心因碰撞而使用HashMap,不要這麼做。它照顧你的一切。 – nos 2012-07-30 18:58:20
HashMap已經使用鏈表。它也會對你的hashCode進行置換,所以如果它不是很好的話,它就很重要。 – 2012-07-30 20:50:33