Java 8中迭代HashMap时稳定的元素顺序问题

6
我的应用程序依赖于元素插入顺序,但某些测试用例失败了。在使用Java 7时它可以正常工作,但升级到Java 8后出现了这个问题。在搜索网络时,我在article中发现了以下内容:
Java 8可能对HashSet/Map迭代顺序进行了一些更改。
请问有人能建议我如何按照对象插入Map的顺序遍历Map中的对象,在我的开发环境中仍将使用Java 1.8?
当然,HashMap从未保证可以按相同的顺序检索对象,但是在Java 7中确实可以工作。
LinkedHashMap是否适用于此实现?

1
LinkedHashMap 的文档告诉你什么? - RealSkeptic
6
你有没有查看Java 7中HashMap文档的内容?:https://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html :该类不能保证映射的顺序,特别是它不保证顺序会随时间保持恒定。你必须使用其他保证顺序的集合 - LinkedHashMap。 - krokodilko
1
使用JavaDocs中的TreeMap代替。它是一种基于红黑树的NavigableMap实现。该映射根据其键的自然顺序进行排序,或者根据在创建映射时提供的比较器进行排序,具体取决于使用哪个构造函数。 - Jorge Campos
@RealSkeptic - 它表示,它将按照条目放入映射的顺序进行迭代。我认为LinkedHashMap可以解决这个问题 - 但仍然想确认一下是否有人已经遇到并解决了这个问题。 - Siddhartha
4
确认方法正确的方式是尝试。询问人类是否可以运行不如在机器上直接在您的具体情况下尝试,这样效率要低得多。 - RealSkeptic
1个回答

9
是的,您必须使用 LinkedHashMap。它具有稳定的迭代顺序,即使在不同的Java版本中也是如此,因为其 合约 对此进行了强制说明:

这种实现与HashMap的区别在于,它维护一个双向链表,通过其中所有条目。该链接列表定义了迭代顺序,通常是键插入到映射中的顺序(插入顺序)。请注意,如果将键重新插入到映射中,则不会影响插入顺序。

在多个场合下,我们还需要在不同的Java版本中保持可重复的迭代顺序,LinkedHashMap 也可以很好地解决问题。


TreeMap 也是稳定迭代顺序的解决方案。当然,它的操作时间是对数级别的(与 LinkedHashMap 中的常数级别不同),且迭代顺序不是插入顺序而是键顺序:

该映射根据其键的自然排序或通常在创建排序映射时提供的比较器进行排序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接