2010-09-28 108 views
19

我需要Google Collection的组合ImmutableMapLinkedHashMap —具有定义迭代次序的不可变映射。看起来ImmutableMap本身实际上已经定义了迭代次序,至少是its documentation saysGoogle Collections ImmutableMap迭代次序

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

但是没有更多的细节。快速测试表明这可能是真实的,但我想确保。不幸的是,快速查看源代码并不能帮助我。

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

+0

我相信藏品已经被折叠到番石榴图书馆。但ImmutableMap的文档也是一样的。 – Thilo 2010-09-28 08:06:24

回答

17

更确切地说,ImmutableMap工厂方法和构建器返回实例遵循输入的迭代顺序时提供在构建的地图。但是,ImmutableSortedMap是ImmutableMap的子类。排序键。

4

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

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

19

我居然发现讨论此事,以answers from library authors

凯文Bourrillion:我们所说的“用户指定的”是什么“可以,你想让它 是什么令”;换句话说,无论您在 的首位提供给我们的条目是什么,这就是我们使用的顺序。

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

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

+3

+1我同意你的看法,JavaDoc可能会更清晰。 “可靠的用户指定迭代顺序”可能没有其他解释,但对copyOf()方法有一点冗余的注释,它保持源映射的迭代顺序不会受到伤害。 of()系列的方法确实有这种评论(“按照顺序返回包含给定条目的不可变映射”)。 – Thilo 2010-09-28 08:12:43

+0

@Thilo:啊,我没有注意到这些()方法的注释。谢谢。 – 2010-09-28 08:13:48