我在java中使用HashMap
来存储密钥和Object <Key,Object>
。我读到了关于hashmap碰撞的内容,我试图通过使用链表来避免它。
我在线进行了一些搜索,但是我找不到一个如何执行此操作的示例。
有人可以指向我实现带链表的哈希映射的在线资源吗?
答案 0 :(得分:5)
Java HashMap已经以这种方式为您处理冲突。您需要做的就是确保覆盖并实施密钥的hashCode()
和equals()
方法。
每个hash code
都会映射到特定的“存储桶”。每个桶包含一个用于碰撞情况的链表。
避免(或者更确切地说是最小化)冲突的唯一方法是创建一个哈希函数,在整个HashMap中创建最佳的值分布。根据HashMap的密度和hash code
的质量,碰撞几乎是不可避免的,因此需要覆盖这两种方法。
修改:OP要求提供示例
要覆盖这两种方法:
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;
}
}
答案 1 :(得分: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);