【问题标题】:Google Collections ImmutableMap iteration orderGoogle Collections ImmutableMap 迭代顺序
【发布时间】:2011-04-18 03:59:32
【问题描述】:

我需要结合使用 Google Collection ImmutableMapLinkedHashMap — 具有已定义迭代顺序的不可变映射。看来 ImmutableMap 本身其实已经定义了迭代顺序,至少its documentation says

一个不可变的、基于散列的 Map,具有可靠的用户指定的迭代顺序。

但是没有更多细节。快速测试表明这可能是真的,但我想确定一下。

我的问题是:我可以依赖 ImmutableMap 的迭代顺序吗?如果我做ImmutableMap.copyOf(linkedHashMap),它的迭代顺序是否与原始链接哈希图相同?由builder创建的不可变地图呢?一些权威答案的链接会有所帮助,因为谷歌没有发现任何有用的东西。 (不,源链接不算在内)。

【问题讨论】:

  • 我相信 Collections 现在已经被折叠到 Guava 库中了。但是 ImmutableMap 的文档是一样的。

标签: java iteration guava


【解决方案1】:

你应该相信 javadoc。如果还不够,请阅读源代码或报告错误。

快速查看源代码可以看出,映射由数组支持,并且迭代将通过同样由数组支持的 ImmutableSet 完成。所以我认为文档是正确的,元素的顺序会保持原样。

【讨论】:

    【解决方案2】:

    我实际上已经找到了关于这个的讨论,answers from library authors

    Kevin Bourrillion:我们所说的“用户指定”是指“它可以是您想要的任何顺序 是”;换句话说,无论您在 首先,这是我们使用的顺序。

    Jared Levy:您还可以复制具有所需顺序的 TreeMap 或 LinkedHashMap。

    是的,我应该相信 javadoc,尽管我认为 javadoc 在这种情况下可能会更好。似乎我不是第一个对此感到困惑的人。如果不出意外,这个 Q/A 将在下次有人搜索“ImmutableMap 迭代”时帮助 Google :-)

    【讨论】:

    • +1 我同意你的观点,JavaDoc 可以更清晰。对于“可靠的用户指定的迭代顺序”可能没有其他解释,但是对 copyOf() 方法的一点多余评论,它保持源映射的迭代顺序不会有坏处。 of() 系列方法确实有这种注释(“按顺序返回包含给定条目的不可变映射。”)
    • @Thilo:啊,我没有注意到 of() 方法的这些 cmets。谢谢。
    【解决方案3】:

    更准确地说,ImmutableMap 工厂方法和构建器返回的实例遵循构建地图时提供的输入的迭代顺序。然而,一个 ImmutableSortedMap,它是 ImmutableMap 的一个子类。对键进行排序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-31
      • 1970-01-01
      • 1970-01-01
      • 2016-01-18
      • 2012-12-28
      • 2011-02-11
      • 1970-01-01
      • 2020-11-23
      相关资源
      最近更新 更多