在地图中的运行时迭代中发生的顺序

时间:2014-03-28 10:27:39

标签: java collections map iterator

在类似于

的代码中
//something before
Iteration<String> iterator = hashMap.keySet().iterator();// HashMap<String, Document>
while(iterator.hasNext()){
      System.out.println(iterator.next());
}
//something after

我知道按照输入键,值的顺序,打印顺序可能会有所不同;好的。

但是如果我在另一个时刻调用这个片段,重新创建变量 hashMap 并将它们放在相同的元素中,第二时刻的打印时间是否可以与首次打印不同?

我的问题是由一个网络应用程序的问题而产生的:我在JSP中有一个字符串的列表,但是,在几年后,客户调用因为的顺序字符串在早上有所不同,但它显示了下午的通常顺序。

问题仅在一天内发生:网络应用程序使用解释的代码片段来获取地图并填充 ArrayList

这个 ArrayList 没有任何明确的顺序更改(没有 Comparator 或类似的类)。

我认为(希望)不同打印顺序的原因是在运行时在相同的 HashMap 中通过不同的迭代序列导出,并且我正在寻找其他人的验证。

在网络中,我读到如果 HashMap 收到修改, HashMap 的迭代顺序会发生变化:但是如果 HashMap 保持不变?

4 个答案:

答案 0 :(得分:1)

HashMap API documentation表明

  

此课程不保证地图的顺序;特别是,它不保证订单会随着时间的推移保持不变。

答案 1 :(得分:1)

Hash map document says HashMap不保证地图的顺序;特别是,它不保证订单会随着时间的推移保持不变。

虽然解释虽然hashmap是相同的,但它无法保证订单。对于有序地图,您可以使用TreeMapLinkedHashMap

TreeMap API表示地图是根据其键的自然顺序排序的,或者是在地图创建时提供的比较器,具体取决于使用的构造函数。

答案 2 :(得分:1)

对于将其键保持在原始插入顺序中的Map,请使用LinkedHashMap

对于将其键保持为排序顺序(自然顺序或通过您传递ComparatorMap),请使用TreeMap或{{ 3}}。如果是多线程,请使用第二个。

对于其中键为枚举的Map,如果要按枚举对象的定义顺序排序的条目,请使用ConcurrentSkipListMap

与Java 11捆绑在一起的其他六个Map实现对它们的条目不承诺任何顺序。

请参阅我的此图形表作为概述。

EnumMap

答案 3 :(得分:0)

改为使用LinkedHashMap来保留广告订单。来自javadoc:“Map接口的哈希表和链表实现,具有可预测的迭代顺序。”

如果您只想要一个具有可预测排序的Map,那么您也可以使用TreeMap。但是,LinkedHashMap更快,如here所示:“根据Javadoc,TreeMap对containsKey,get,put和remove具有O(log n)性能,而LinkedHashMap为O(1)每个。“

正如八达通所说,HashMap“不保证地图的顺序”,如果订单必须保持一致,你不应该使用它。