【问题标题】:Occurred order in the iteration at run-time in a map地图运行时迭代中发生的顺序
【发布时间】:2014-05-07 18:12:16
【问题描述】:

在类似于

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

我知道打印的顺序可能会因entry的插入顺序而不同key,value;好的。

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

我的问题是由一个网络应用程序的问题引起的:我在 JSP 中有一个 String 列表,但是,几年后,客户致电,因为 的顺序字符串在早上不同,但在下午显示通常的顺序。

问题仅在一天之内就发生了:网络应用程序使用解释的代码获取 Map 并填充 ArrayList

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

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

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

【问题讨论】:

  • Hash map 文档说 HashMap 不保证 map 的顺序;特别是,它不保证订单会随着时间的推移保持不变。
  • 好的,我可以接受这个回复:你能给我一个链接或显示这句话的源代码吗?如果您写回复,我会选择您的回复为“最佳回复”
  • 谢谢.. 我将此评论移至回答部分

标签: java collections map iterator


【解决方案1】:

HashMap API documentation 声明

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

【讨论】:

    【解决方案2】:

    请改用LinkedHashMap,以保留插入顺序。来自javadoc:“Map 接口的哈希表和链表实现,具有可预测的迭代顺序。”

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

    正如 Octopus 所说,HashMap“不保证地图的顺序”,如果顺序必须保持一致,则不应使用它。

    【讨论】:

      【解决方案3】:

      Hash map document saysHashMap 不保证映射的顺序;特别是,它不保证订单会随着时间的推移保持不变。

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

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

      【讨论】:

        【解决方案4】:

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

        对于将其键保持在排序顺序(自然顺序或通过您传递Comparator)的Map,请使用TreeMapConcurrentSkipListMap。如果是多线程的,请使用第二个。

        对于键为枚举的Map,如果您希望条目按枚举对象的定义顺序排序,请使用EnumMap

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

        请查看我的这张图表作为概览。

        【讨论】:

          猜你喜欢
          • 2013-01-27
          • 2019-10-18
          • 2017-09-12
          • 1970-01-01
          • 1970-01-01
          • 2019-11-23
          • 1970-01-01
          • 2016-01-18
          • 2012-12-28
          相关资源
          最近更新 更多