Guava 的 ImmutableSet 成员方法是否模仿 java.util.HashSet#contains?

Cht*_*ect 5 java set hashset guava

我需要确保Set<String>我创建的某个内容不会在代码中的其他地方被修改。当然,我最终使用了 Guava 的ImmutableSet为此

Set#contains这个不可变集非常大(大约 59K 字符串),每次调用特定方法时我都必须执行检查。所以我想知道是否有任何方法可以指定大集合中的查找。番石榴的文档说:

高性能、不可变的 Set,具有可靠的、用户指定的迭代顺序。不允许空元素。

user-specified iteration如果通过调用创建不可变集意味着什么ImmutableSet#copyOf(aHashSet)?contains(String)如果我使用ImmutableSet#contains代替 ,性能会受到不利影响吗HashSet#contains?更准确地说,我的问题如下:

有了一个像样的哈希函数,并且同一桶中没有太多元素,人们期望时间复杂度HashSet#contains为 O(1)。使用创建的 ImmutableSet 会copyOf遵守这一点吗?

我怀疑情况可能并非如此,有两个原因:

  1. 番石榴论坛讨论正是关于这个问题的(不过似乎没有提供结论性的答案)。

  2. 我不清楚是否ImmutableSet#contains遵循java.util.Set#contains(即,在我的例子中的实现HashSet)或com.google.common.collect.ImmutableCollection#contains。如果是后者,那么ImmutableSet#contains将是一个 O(n) 操作。

Mar*_*ers 4

我在文档中看到的唯一确认如下:

这个类的工厂方法创建基于哈希的实例,...

换句话说,您可以期望查找使用类似于以下的哈希机制(因此具有性能特征)HashSet. 这些文档故意含糊不清,以便可以进行各种改进(例如,对某些特殊情况使用特殊的实现,例如单例或空集)。

迭代顺序将取决于创建方法。在 的情况下copyOf,它将是Iterable您传入的迭代顺序(当然是在制作副本时)。这是有充分记录的:

按顺序返回包含给定元素的不可变集。

至于它是否遵循集合的 contains 方法,没有。因为ImmutableSet创建副本(与 不同Collections.unmodifiableSet()),所以它显然不能遵循原始集进行任何操作。