【问题标题】:Does entrySet() in a LinkedHashMap also guarantee order?LinkedHashMap 中的 entrySet() 是否也保证顺序?
【发布时间】:2010-11-14 11:23:51
【问题描述】:

当有人尝试访问它时,我使用linkedHashMap 来保证顺序。但是,当需要对其进行迭代时,使用 entrySet() 返回键/值对是否也能保证顺序?迭代时不会进行任何更改。

编辑:另外,通过遍历其键并调用 get 来遍历映射是否有任何不利影响?

【问题讨论】:

标签: java linkedhashmap


【解决方案1】:

根据Javadocs,是的。

此实现与HashMap 的不同之处在于,它维护了一个双向链表,贯穿其所有条目。这个链表定义了迭代顺序,通常是键插入映射的顺序(insertion-order)。

至于编辑,不,它应该可以正常工作。但是条目集更快一些,因为它避免了在迭代期间查找映射中每个键的开销。

【讨论】:

  • 但是 entrySet 返回的 Set 本身是无序的?
  • 是的,从技术上讲,entrySet 本身无法访问位置,但 entrySet.iterator() 可以。迭代器让我们有一个有序列表。
  • 我想知道这个答案是正确的,但正如乔纳森指出的那样,entrySet() 返回一个集合。 Jpatrick 说集合的迭代器让我们有一个有序列表,但docs.oracle.com/javase/6/docs/api/java/util/Set.html#iterator() 说“元素以没有特定的顺序返回(除非这个集合是某个提供保证的类的实例)。”并且这里引用的文档都没有说 entrySet() 返回一个 Set ,它是保证顺序的类的实例。我错过了什么吗?
  • Michael Myers 指出文档说 LinkedHashMap 定义了迭代排序是正确的,但它没有说明如何访问该排序。 entrySet().iterator() 是一种合理的方式,但可以依赖它吗?
  • 在这里找到了明确的答案:stackoverflow.com/a/2924143/423105“地图的顺序定义为地图集合视图上的迭代器返回其元素的顺序。” -- Map的javadoc
【解决方案2】:

如果您确定在迭代期间不会进行任何更改,则可以保证使用entrySet() 进行正确排序,如API 中所述。

【讨论】:

  • 您为entrySet() 链接的API 文档没有说明任何关于保证正确排序的内容。该页面上唯一相关的声明是“此类 [即 HashMap] 不保证地图的顺序;特别是,它不保证顺序会随着时间的推移保持不变。”你用那个链接指的是什么?
【解决方案3】:

这个链表定义了迭代顺序,通常是键插入映射的顺序(插入顺序)。请注意,如果将键重新插入到地图中,则插入顺序不会受到影响。 (如果在调用 m.containsKey(k) 将在调用之前立即返回 true 时调用 m.put(k, v),则将键 k 重新插入到映射 m 中。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-24
    • 2021-04-21
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    • 2022-08-02
    相关资源
    最近更新 更多