2012-07-30 79 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