【问题标题】:Iteration order of a LinkedHashMapLinkedHashMap 的迭代顺序
【发布时间】:2012-12-28 20:44:17
【问题描述】:

在阅读了LinkedHashMap 的文档(并多次使用它)之后,我仍然不清楚它的一个属性...是LinkedHashMap 的迭代顺序:

  1. 与entrySet()、keySet() 和values() 的插入顺序相同,或者
  2. 与entrySet() 和keySet() 的插入顺序相同,但与values() 不同,或者
  3. 仅与 entrySet() 的插入顺序相同?

我认为第三种情况不太可能,但我想知道是否有人知道 (1) 或 (2) 是否正确,因为迭代 values() 可能是一个罕见的用例。

【问题讨论】:

  • 查看源代码后,我意识到三个迭代器都尊重插入顺序。
  • 简单地尝试一个例子怎么样?
  • 轶事证据的证明对我来说并没有真正站得住脚......我最终查阅了源代码。谢谢!
  • @MrSmith42:这种类型的问题尝试一个例子可能不会告诉你什么价值。您很容易得到误报——对于给定的示例,插入顺序碰巧保持不变,但对于更复杂或更长时间运行的示例则不会。
  • 并不是说检查源要好得多。 :-)

标签: java hashmap linkedhashmap


【解决方案1】:

LinkedHashMap 尊重插入顺序;所以第一选择是好的。

Map 是一组 Map.Entry 对象,选项 2 和 3 会很奇怪 ;)

【讨论】:

  • Map.Entry 对象的集合是有道理的,尽管我从未意识到它是这样的。例如,我认为双向链表可能只通过键运行。现在我已经查看了源代码,这确实很明显。
  • 好吧,.entrySet() 返回一个Set<Map.Entry<K, V>>。如果您在读取 ​​k1 时插入 k1, v1 然后 k2, v2 所有这些来读取 v2,那将是相当可悲的:p
  • 另外,如果不经过entrySet()、keySet() 或values(),您不可能遍历LinkedHashMap——它并没有确切的“插入顺序”自己的。
  • 哎呀,对不起,意思是“迭代顺序”。
  • 澄清一下,keySet() 和 values() 集合按照插入的顺序进行迭代。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-18
  • 2011-02-11
  • 1970-01-01
  • 2012-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多