2017-05-09 87 views
4

我正在寻找一个实现,它通过键自动对它的条目进行排序。我发现TreeMap的实现,这是正确的。但是,在我创建的测试中,我发现HashMap中的条目按键排序,如果该键的类型为Integer,则默认情况下。我可以假设HashMap这样工作(并继续工作),并安全地使用它,或者我应该使用TreeMap为此目的?如果密钥的类型是Integer,HashMap条目是否总是按键排序?

+5

HashMap的键或值没有默认排序。 –

+3

哈希映射关键字不保证以任何特定的顺序。如果你继续尝试,最终你会发现它们并不总是以你期望的顺序发生。 – khelwood

+1

您可以使用[SortedMap](https://docs.oracle.com/javase/7/docs/api/java/util/SortedMap.html)对已排序的键进行排序。 – Obenland

回答

7

不,您不能假设HashMap中的条目按键排序,因为它们不是。

您可能使用Integer键检测了少量条目,因为IntegerhashCode本身就是它的int值,所以它似乎是排序的,因此键1进入了仓1,等等......当你对条目进行迭代时,它们似乎是按键排序的,因为迭代顺序是根据bin的索引。

尝试大Integer键,你会看到他们没有排序。

例如:

尽管此代码产生已排序的键:

HashMap<Integer,String> map = new HashMap<>(); 
for (int i=0;i<10;i++) { 
    map.put (i, Integer.toString (i)); 
} 
for (Integer key : map.keySet()) { 
    System.out.println (key); 
} 

输出:

0 
1 
2 
3 
4 
5 
6 
7 
8 
9 

此代码不:

HashMap<Integer,String> map = new HashMap<>(); 
for (int i=0;i<10;i++) { 
    map.put (i*100, Integer.toString (i)); 
} 
for (Integer key : map.keySet()) { 
    System.out.println (key); 
} 

输出:

0 
400 
800 
100 
500 
900 
200 
600 
300 
700 
相关问题