我在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