2014-07-02 46 views
-2

对不起,如果这个问题不清楚。我对散列表的知识非常有限。这是面试时向我提出的问题。如果所有密钥的哈希码相同,HashMap排序如何工作

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

我的理解是,如果散列码相同,那么新条目将替换散列映射中的旧条目。

但是当我搜索了解更多关于散列表如何工作如果两个对象的散列码是相同的,我foudn这两个对象将存储在链接列表形式的存储桶中。

但不清楚在这种情况下如何排序。如果我们尝试使用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

排序? 'HashMap'不做任何排序。 – SudoRahul

+0

是的,HashMap没有排序。从[javadocs](http://docs.oracle.com/javase/6/docs/api/java/util/HashMap.html):'这个类不能保证地图的顺序;'你'你需要更清楚你的意思,或者你的问题可能会被关闭 –

回答

1

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

总之:改变你的hashcode算法以减少冲突。

+0

我可以在散列表中存储多个条目,其中所有对象都返回相同的散列码。请参考我更新的问题。 – OneTwo

0

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

0

散列映射不按排序顺序存储元素。 用于在散列码的帮助下存储它的appropriete存储桶。

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

相关问题