- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我需要确保某个 Set<String>
我创建的代码没有在其他地方修改。当然,我最终使用了 Guava 的 ImmutableSet为此。
这个不可变集非常大(大约 59K 个字符串),我必须执行 Set#contains
每次调用特定方法时检查。所以我想知道是否有任何方法可以指定大集合中的查找。 Guava 的文档说:
A high-performance, immutable Set with reliable, user-specified iteration order. Does not permit null elements.
什么是user-specified iteration
意味着如果不可变集是通过调用 ImmutableSet#copyOf(aHashSet)
创建的?请问性能contains(String)
如果我使用 ImmutableSet#contains
会受到不利影响而不是 HashSet#contains
?更准确地说,我的问题如下:
有了一个不错的散列函数并且没有太多元素进入同一个桶,人们会期望 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) 操作。
最佳答案
我在 the documentation 中看到的唯一确认是以下内容:
this class's factory methods create hash-based instances, ...
换句话说,您可以期望查找使用类似于 HashSet
的散列机制(因此具有性能特征)。文档故意含糊不清,以便可以进行各种改进(例如,对某些特殊情况使用特殊实现,如单例或空集)。
迭代顺序将取决于创建方法。在 copyOf
的情况下,它将是您传入的 Iterable
的迭代顺序(当然是在创建副本时)。这是有据可查的:
Returns an immutable set containing the given elements, in order.
至于是否服从set的contains方法,没有。因为 ImmutableSet
制作了一个副本(与 Collections.unmodifiableSet()
不同),它显然不能推迟到原始集的任何操作。
关于java - Guava 的 ImmutableSet 成员方法是否模仿 java.util.HashSet#contains?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28391456/
POM.xml : 4.0.0 **** **** 1.0 com.web web war
我想知道这个调用是否是线程安全的。例如,如果我有一组 s: Set s = new HashSet<>(); 还有两个线程A和B,线程A修改集合: for (int i = 0; i newS =
我有一个 ImmutableSet 的实例。现在我需要包含该集合中除一个之外的所有元素的新实例。就像是 ImmutableSet numbers = ImmutableSet.of(2, 3, 4,
我习惯了 C# 我们有 IEnumerable.SelectMany但发现自己使用 Google 的 Guava 库涉猎了一些 Java 代码。是否有与 Guava 中的 SelectMany 等效的
Guava 的ImmutableSet在我关于 contains 的基准测试中似乎表现很差.对于某些尺寸,它甚至比 List 慢得多。 : size benchmark
我有以下设置(即 Entity 是一个 JPA2 实体,entities 是一个集合) class Entity { Set entities = new HashSet<>(); p
elastic-search 项目中的 ImmutableSettings 类已经不存在了。我发现类被删除了。 “org.elasticsearch.common.settings.Immutable
我有一个类 class Receipt { private Set orders; public Receipt(Set orders) { this.
Javadoc对于 com.google.common.collect.ImmutableSet建议有两种方法可以创建 ImmutableSet 的实例来自 E 类型的元素(例如 E e1 和 E e
我希望避免出现多个 if-else 条件。下面的代码有没有更简洁的写法? private Set getValues(Optional one, Optional two) { if (one
这是我希望通过的单元测试: import static org.junit.Assert.assertEquals; import org.jmock.Expectations; import org
我读了here关于使用 Guava 中的 ImmutableSet 的一个很好的例子。为了完整起见,在此报告该示例: public static final ImmutableSet COLOR_NA
具有此端点定义: @RequestMapping(value = "/foo_resource", method = RequestMethod.GET) public FooResponse ret
elastic-search 项目中的 ImmutableSettings 类已经不存在了。我发现类被删除了。 我在 ImmutableSetting 类中使用函数 settingsBuilder()
我从 1.7 升级了我的 Google App Engine 应用程序。到 1.8。 + Java 7,我将所有 API 库升级为最新版本。我在 GAE 容器中进行应用程序初始化期间遇到奇怪的异常:
ImmutableSet 的 JavaDoc 说: Unlike Collections.unmodifiableSet, which is a view of a separate collecti
你好, 我有一个包含一些数据的集合: Set aItems = aItem .getItems( ); 因为要排序,所以先转成list,排序后,才转回set:
假设您要构建一个 ImmutableSet/List/Map 对象的副本,但要过滤掉一些原始条目。一种实现方法如下: ImmutableList.copyOf(Iterables.filter(myO
我需要确保某个 Set我创建的代码没有在其他地方修改。当然,我最终使用了 Guava 的 ImmutableSet为此。 这个不可变集非常大(大约 59K 个字符串),我必须执行 Set#contai
我的代码中有一个错误,我正在尝试修改一个实际上是从客户端程序/程序员传入的 Guava ImmutableList 的列表。 最好的测试方法是什么,而不是在 .add() 失败时等待异常? 最佳答案
我是一名优秀的程序员,十分优秀!