Google Collections ImmutableMap迭代订单

Pet*_*aný 25 java iteration guava

我需要将Google Collection ImmutableMapLinkedHashMap- 不可变映射与定义的迭代顺序组合在一起.似乎ImmutableMap本身实际上已经定义了迭代顺序,至少它的文档说:

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

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

我的问题是:我可以依赖ImmutableMap的迭代顺序吗?如果我这样做ImmutableMap.copyOf(linkedHashMap),它将具有与原始链接哈希映射相同的迭代顺序吗?构建器创建的不可变映射怎么样?一些权威答案的链接会有所帮助,因为谷歌没有找到任何有用的东西.(不,与来源的链接不计算在内).

Pet*_*aný 26

我实际上已经找到了关于这个问题的讨论,以及图书馆作者的答案:

Kevin Bourrillion:"用户指定"的意思是"它可以是你想要的任何顺序"; 换句话说,无论您首先向我们提供条目的顺序,这就是我们使用的顺序.

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

是的,我应该相信javadoc,尽管我认为javadoc在这种情况下会更好.看来我不是第一个被它搞糊涂的人.如果没有别的,这个Q/A将帮助谷歌下次有人搜索"ImmutableMap迭代":-)

  • +1我同意你的观点,JavaDoc可能更清晰."可靠的用户指定的迭代顺序"可能没有其他解释,但是对copyOf()方法的一点冗余注释,它保持源映射的迭代顺序不会受到伤害.of()系列方法确实有这种注释("按顺序返回包含给定条目的不可变映射.") (3认同)

Jar*_*evy 21

更确切地说,ImmutableMap工厂方法和构建器返回实例,这些实例遵循构造中的映射时提供的输入的迭代顺序.但是,一个ImmutableSortedMap,它是ImmutableMap的子类.对键进行排序.


nan*_*nda 5

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

对源代码的快速浏览显示,映射由数组支持,迭代将通过也由数组支持的ImmutableSet完成.所以我认为文档是正确的,元素的顺序将保持不变.