4
我正在寻找一个实现,它通过键自动对它的条目进行排序。我发现TreeMap
的实现,这是正确的。但是,在我创建的测试中,我发现HashMap
中的条目按键排序,如果该键的类型为Integer
,则默认情况下。我可以假设HashMap
这样工作(并继续工作),并安全地使用它,或者我应该使用TreeMap
为此目的?如果密钥的类型是Integer,HashMap条目是否总是按键排序?
我正在寻找一个实现,它通过键自动对它的条目进行排序。我发现TreeMap
的实现,这是正确的。但是,在我创建的测试中,我发现HashMap
中的条目按键排序,如果该键的类型为Integer
,则默认情况下。我可以假设HashMap
这样工作(并继续工作),并安全地使用它,或者我应该使用TreeMap
为此目的?如果密钥的类型是Integer,HashMap条目是否总是按键排序?
不,您不能假设HashMap
中的条目按键排序,因为它们不是。
您可能使用Integer
键检测了少量条目,因为Integer
的hashCode
本身就是它的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
HashMap的键或值没有默认排序。 –
哈希映射关键字不保证以任何特定的顺序。如果你继续尝试,最终你会发现它们并不总是以你期望的顺序发生。 – khelwood
您可以使用[SortedMap](https://docs.oracle.com/javase/7/docs/api/java/util/SortedMap.html)对已排序的键进行排序。 – Obenland