如果所有密钥的哈希码都相同,HashMap排序如何工作

时间:2014-07-02 09:05:08

标签: java hashmap

很抱歉,如果这个问题不明确。我对hashmap的了解非常有限。这是在采访中向我提出的问题。

如果所有对象都返回相同的hascode,并且如果我们将这些对象用作键存储在hashmap中。在这种情况下排序如何工作?

我的理解是,如果hashcode相同,则新条目将替换hashmap中的旧条目。

但是当我搜索了解更多关于如果两个对象hashcode相同时hashmap的工作原理时,我发现这两个对象都将存储在存储桶中的链表中。

但尚不清楚在这种情况下排序将如何运作。如果我们尝试使用TreeMap对此hashpMap进行排序。

请帮助我理解这一点。

下面的代码在hashmap中存储多个条目,其中所有对象的hashcode都相同。

import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

public class Employee implements Comparable
{
   private String name;
   private int age;

   public Employee(String name, int age)
   {
      this.name = name;
      this.age = age;
   }

   @Override
   public String toString()
   {
      return name + ": " + age;
   }

   @Override
   public int hashCode(){
       return 1;       
   }

   @Override
   public boolean equals(Object o){
       if (!(o instanceof Employee))
             return false;
          Employee e = (Employee) o;
          return e.getName().equals(name) && e.getAge() == age;

   }

   String getName()
   {
      return name;
   }

   int getAge()
   {
      return age;
   }

   public static void main(String a[]){
       Employee e = new Employee("Sub" , 25);
       Employee e1 = new Employee("Sub1" , 20);
       Employee e2 = new Employee("Sub2" , 22);
       System.out.println(e);

       Map m = new HashMap();
       m.put(e , "A");
       m.put(e1 , "B");
       m.put(e2 , "C");

       System.out.println(m);

       TreeMap t = new TreeMap(m);

       System.out.println(t);

   }

@Override
public int compareTo(Object arg0) {
    return ((Employee)arg0).getName().compareTo(this.name);
}
}

3 个答案:

答案 0 :(得分:1)

根据从哈希码函数获得的哈希值,将对象分布在存储空间中。如果所有对象都返回相同的哈希码,则对于添加到HashMap的每个对象都会发生冲突。此外,您还可以为从Hashmap获得的每个对象进行顺序搜索(使用equals方法)。

简而言之:更改哈希码算法以减少冲突。

答案 1 :(得分:0)

如果您需要添加相同的键但值不同,我建议您使用apache commonsguava中的MultiMap。我发现它更有用,因为你可以使用ListMultimap(Guava),然后如果添加相同的键,它将不会混合,值将被添加到列表中。我知道这不是问题,但我认为你问过它,因为你有一些问题。

答案 2 :(得分:0)

hashmap不是按排序顺序存储元素。 为了存储它,请在哈希码的帮助下查找合适的存储桶。

如果hashcode相同,它将以linklist格式存储元素,并且仅使用单个存储桶。