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