这个问题在这里已有答案:
这个问题只是出于好奇,但我注意到使用keyset迭代HashMap似乎总是按排序顺序进行。显然,使用HashMaps永远不会保留插入顺序,但排序的键顺序对我来说似乎有点奇怪。使用此示例:
import java.util.HashMap;
public class test {
public static void main(String[] args) {
HashMap<Integer, String> someMap = new HashMap<Integer, String>();
someMap.put(0, "nothing");
someMap.put(7, "nothing");
someMap.put(3, "nothing");
someMap.put(4, "nothing");
someMap.put(10, "nothing");
someMap.put(11, "nothing");
someMap.put(2, "nothing");
someMap.put(1, "nothing");
someMap.put(5, "nothing");
for (Integer someInt : someMap.keySet()) {
System.out.println(someInt);
}
}
}
输出:
0
1
2
3
4
5
7
10
11
这是可靠和一致的吗?如果HashMap实现是一个数组,如果keyset只是从0开始迭代所有可用的数组索引,这将是有意义的,但我可能错了,它比这更复杂。
HashMaps
和HashSets
期间没有特别的保证。您可以通过删除和添加一些元素来排序您的订单。
结帐:
import java.util.HashMap;
public class test {
public static void main(String[] args) {
HashMap<Integer, String> someMap = new HashMap<Integer, String>();
someMap.put(0, "nothing");
someMap.put(7, "nothing");
someMap.put(3, "nothing");
someMap.put(4, "nothing");
someMap.put(10, "nothing");
someMap.put(11, "nothing");
someMap.put(2, "nothing");
someMap.put(10004, "nothing");
someMap.put(1, "nothing");
someMap.put(5, "nothing");
for (Integer someInt : someMap.keySet()) {
System.out.println(someInt);
}
}
}
在大多数类型的散列集中,散列函数排除特定值的位置。
来自javadoc:
这个类不保证地图的顺序;特别是,它不保证订单会随着时间的推移保持不变。
您所看到的可能是关于JVM实现以及如何管理哈希码的巧合,或者可能(但不太可能):
请注意,使用具有相同hashCode()的许多键是减慢任何哈希表性能的可靠方法。为了改善影响,当键是Comparable时,此类可以使用键之间的比较顺序来帮助打破关系。
在任何情况下,这都不可靠或不变。
可能是这样;但由于它没有在java文档中记录,因此您不应该根据此类行为进行编码。由于新的Java版本可以更改HashMap
实现,这可能会提供非升序订单键;所以根据这种行为你所做的任何代码都会破坏