HashMap Java示例避免冲突

时间:2012-07-30 18:56:27

标签: java hashmap

我在java中使用HashMap来存储密钥和Object <Key,Object>。我读到了关于hashmap碰撞的内容,我试图通过使用链表来避免它。

我在线进行了一些搜索,但是我找不到一个如何执行此操作的示例。

有人可以指向我实现带链表的哈希映射的在线资源吗?

2 个答案:

答案 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);