如果键的类型为Integer,HashMap条目是否始终按键排序?

时间:2017-05-09 13:20:16

标签: java

我正在寻找一种实现,它会按键自动对其条目进行排序。我找到了TreeMap实现,这是正确的。但是,在我创建的测试中,我发现HashMap中的条目默认情况下,如果键的类型为Integer,则按键排序。我可以假设HashMap可以这样工作(并继续工作)并安全使用它,还是应该TreeMap用于此目的?

1 个答案:

答案 0 :(得分:7)

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

您可能使用小Integer个键测试了少量条目,这些条目似乎已排序,因为hashCode的{​​{1}}本身就是其int值,因此键1变为到bin 1,key 2转到bin 2等等...当你遍历条目时,它们似乎按键排序,因为迭代顺序是根据bin的索引。

尝试使用大Integer个密钥,您会看到它们没有排序。

例如:

虽然此代码生成排序键:

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);
}