【问题标题】:Does Java's LinkedHashMap maintain the order of keys? [duplicate]Java 的 LinkedHashMap 是否维护键的顺序? [复制]
【发布时间】:2011-03-29 12:41:59
【问题描述】:

调用LinkedHashMap.keySet()时,返回Set的顺序会和key的添加顺序一致吗?

【问题讨论】:

  • 对于那些来自 PHP 的人,让我帮助他们指出 LinkedHashMap 的行为非常类似于 PHP 数组。

标签: java map set linkedhashmap


【解决方案1】:

是的。

见:LinkedHashMap:

这个链表定义了迭代 排序,通常是顺序 其中钥匙被插入 地图(插入顺序)。

并来自HashMap#keySet 文档:

集合 [returned] 由地图支持,所以 地图的变化反映在 集合,反之亦然。

【讨论】:

  • @Tom 谢谢,我仍然不相信这是明确的。为什么 LinkedHashMap.keySet() 不返回具有固定顺序的 Set 子类?
  • 因为如果它返回一个 SortedSet,那么 LinkedHashMap 将添加要求它的键是实现 Comparable 的类型,或者提供一个比较器函数。这不是 Map 所要求的。查看 SortedSet 文档:download.oracle.com/javase/6/docs/api/java/util/SortedSet.html。如果没有这个要求,即使没有实现 Comparable 的键也可以在 LinkedHashMap 中使用,这是更普遍的情况。如果 LinkedHashMap 的键是 Comparable,它的实现甚至可能返回一个 SortedSet,但它根本不是必需的。
  • @Tom 完全正确 - 您要求一个未实现 SortedSet 的有序 Set,我提供了一个示例。
  • @Alison 如果您查看源代码,它确实返回具有固定顺序的 Set 子类。 HashSet 的 keySet() 方法使用一个自定义的 Set 类,该类从迭代器中读取。 LinkedHashMap 覆盖该迭代器以从它自己的映射条目链接列表中读取。 docjar.com/html/api/java/util/HashMap.java.htmldocjar.com/html/api/java/util/LinkedHashMap.java.html
  • @Roman 谢谢,很好的信息。我想知道这是否会在未来发生变化,以及它是否可能依赖于 Java 实现(即 Oracle 与其他)
【解决方案2】:

Yes。例外情况是,当一个键被重新插入时,它会按照它第一次插入列表的顺序出现。

【讨论】:

  • +1 很好地抓住了那个角落。
  • 实际上,例外情况是密钥重新插入,而不是删除和重用。这种情况是当您调用 put(key, value) 以获得地图中已经存在的键时。 (javadoc 清楚地解释了这一点。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-18
  • 1970-01-01
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
  • 2015-04-28
  • 2014-09-29
相关资源
最近更新 更多