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

Ste*_*fan 4 java

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

Era*_*ran 7

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

您可能使用小Integer键测试了少量条目,这些条目似乎是排序的,因为它hashCode的一个Integer是int值本身,因此键1转到bin 1,键2转到bin 2等等...当你迭代时在条目上,它们似乎按键排序,因为迭代顺序是根据索引的分类.

尝试大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);
}
Run Code Online (Sandbox Code Playgroud)

输出:

0
1
2
3
4
5
6
7
8
9
Run Code Online (Sandbox Code Playgroud)

此代码不会:

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);
}
Run Code Online (Sandbox Code Playgroud)

输出:

0
400
800
100
500
900
200
600
300
700
Run Code Online (Sandbox Code Playgroud)