我需要确保我创建的某个Set<String>
未在代码中的其他位置修改。当然,我最终为此使用了Guava的ImmutableSet。Guava的ImmutableSet成员方法模仿java.util.HashSet#是否包含?
这个不可变的集合非常大(大约59K字符串),并且每次调用某个特定的方法时都必须执行Set#contains
检查。所以我想知道是否有任何方法来指定大集合中的查找。番石榴的文档说:
一个高性能,不可变的集可靠,用户指定的 迭代顺序。不允许空元素。
user-specified iteration
如果不可变集是通过调用ImmutableSet#copyOf(aHashSet)
创建的,那么它是什么意思?如果我使用ImmutableSet#contains
而不是HashSet#contains
,contains(String)
的性能会受到不利影响吗?更精确地说,我的问题是:
一个体面的哈希函数并没有太多的因素让在同一个桶中,人们所期望的HashSet#contains
是O(1)。使用copyOf
创建的ImmutableSet会坚持这个吗?
有我的怀疑背后有两个原因,这可能并非如此:
Guava forum discussion on precisely this question(似乎没有虽然提出令人信服的答案)。
目前还不清楚我是否
ImmutableSet#contains
推迟到java.util.Set#contains
(即,在HashSet
实施,在我的情况)或com.google.common.collect.ImmutableCollection#contains
。如果是后者,则ImmutableSet#contains
将是O(n)操作。
是的,迭代将按照传递的迭代次序进行。但我的困惑之间,和[下面的声明](http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/ImmutableCollection.html#contains(java.lang。 Object))“该实现对集合中的元素进行迭代,依次检查每个元素是否与指定元素相等。” 这是否意味着对包含的O(n)检查,即使原始集合是HashSet,因为ImmutableSet继承了ImmutableCollection中的contains方法。 – 2015-02-08 08:16:31
不,它没有。 “这个实现”仅指那个实现,即'ImmutableCollection'。 'ImmutableSet's提供了自己的'contains'实现。 – 2015-02-08 17:43:59
啊,我明白了。我正在查看[此文档](http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/collect/ImmutableSet.html),这让我觉得不然。 – 2015-02-08 20:31:44