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

Java 如果键的类型为Integer,HashMap条目是否总是按键排序?,java,Java,我正在寻找一个实现,它会自动按键对其条目进行排序。我找到了TreeMap实现,它确实做到了这一点。然而,在我创建的测试中,我发现HashMap中的条目是按其键排序的,如果默认键的类型为Integer。我可以假设HashMap这样工作(并保持工作状态)并安全地使用它吗?或者我应该使用TreeMap来实现这个目的吗?不,您不能假设HashMap中的条目是按键排序的,因为它们不是 您可能测试了一小部分带有小Integer键的条目,这些键看起来是被排序的,因为Integer的hashCode本身就是它的

我正在寻找一个实现,它会自动按键对其条目进行排序。我找到了
TreeMap
实现,它确实做到了这一点。然而,在我创建的测试中,我发现
HashMap
中的条目是按其键排序的,如果默认键的类型为
Integer
。我可以假设
HashMap
这样工作(并保持工作状态)并安全地使用它吗?或者我应该使用
TreeMap
来实现这个目的吗?

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

您可能测试了一小部分带有小
Integer
键的条目,这些键看起来是被排序的,因为
Integer
hashCode
本身就是它的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);
}
此代码不包括:

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

HashMap的键或值没有默认顺序。HashMap键不保证按任何特定顺序排列。如果您继续尝试,最终您会发现它们并不总是按您期望的顺序出现。您可以使用a来对键进行排序。@Aominèa
TreeMap
是一个
SortedMap
,因此您也是对的;-)
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