- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我和一位同事一起做了一些测试,我们从数据库中提取数据(大约 350,000 条记录),将每条记录转换为一个对象和一个关键对象,然后将它们填充到一个 ImmutableMap.Builder 中。
当我们调用 build() 方法时,它花了很长时间,可能是由于 ImmutableMap 附带的所有数据完整性检查(重复键、空值等)。公平地说,我们也尝试使用 HashMap ,这花了一些时间,但没有 ImmutableMap 长。我们最终决定只使用 ConcurrentHashMap,我们在迭代记录时填充了 9 个线程,并将其包装在一个不可修改的映射中。表现很好。
我在其阅读的文档中注意到 ImutableMap 并未针对“equals()”操作进行优化。作为一个顽固的不可变主义者,我希望 ImmutableMap 能够处理大量数据,但我觉得它并不适用于此。这个假设对吗?它是否仅针对小型/中型数据集进行了优化?是否有我需要通过“copyOf()”或其他方式调用的隐藏实现?
最佳答案
我猜你的 key.equals()
是一个耗时的方法。
key.equals()
将在 ImmutableMap.build()
中被调用更多次 比 HashMap.put()
(在一个循环中)。 key.hashCode()
同时被调用,HashMap.put()
和 ImmutableMap.build()
。因此,如果 key.equals()
耗时较长,则整个持续时间可能会相差很多。
key.equals()
在 HashMap.put()
期间被调用了几次(好的散列算法会导致一些冲突)。而在 ImmutableMap.build()
的情况下,key.equals()
将在 checkNoConflictInBucket()
时被调用多次。 key.equals()
的复杂度为 O(n)。
一旦构建了 map ,两种类型的 map 在访问时应该不会有太大差异,因为它们都是基于哈希的。
样本:有 10000 个随机字符串作为键。 HashMap.put()
调用
String.equals()
2 次,而 ImmutableMap.build()
调用 3000 次。
关于java - ImmutableMap 是大量键/对象/的次优选择吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28268682/
这个问题已经有答案了: Java-syntax for explicitly specifying generic arguments in method calls (3 个回答) 已关闭 1 年前
我正在学习使用 Guava 库并引用this我看到使用构建器来构造不可变映射的实例。构建器构造函数如何创建抽象类实例? static final ImmutableMap WORD_TO_INT
很像 ImmutableList 可以这样扩展: ImmutableList originalList = ImmutableList.of(1, 2, 3); ImmutableList exten
我有ImmutableMap和List定义顺序。我想要ImmutableList与该命令。例如: map (, , ) list ["kk", "m", "a"] 因此,我想要给定列表中具有定义顺序的
在 Guava 的 ImmutableMap 的 javadocs 中说: Performance notes: unlike HashMap, ImmutableMap is not optimiz
如何处理字符串列表并将其收集到 Map 或 Immutable map 中,只为那些存在值的字符串 String anotherParam = "xyz"; Map.Builder resultMap
在下面非常简单的代码中: public static void test(Map t){ for(Map.Entry e : t.entrySet()){ //The next l
我正在关注this tutorial为了尝试向我的基于 dropwizard 的 API 添加身份验证。 我遇到一个问题,因为本教程需要编写一个 validator 类,并使用以下代码: privat
我在支付网关公司工作,在分析我遇到的代码时ImmuatbleMap 对象。我想知道有关的所有细节。它是什么?它比 map 有什么优势?核心 java 是否支持 ImmuatbleMap? 最佳答案 I
我在 IntelliJ 中有一个包含 pom.xml 的 java 项目,它使用集合 4.0.0 test test 1.0-SNAPSHOT
我想使用 GSON 来反序列化: "starterItems": { "Appeltaart": 3, "Soap_50": 3 } ...进入 Guava ImmutableMap:
比如说,我有一个名为 DomainObject 的类, class DomainObject { private Long id; private String domainParam; }
我和一位同事一起做了一些测试,我们从数据库中提取数据(大约 350,000 条记录),将每条记录转换为一个对象和一个关键对象,然后将它们填充到一个 ImmutableMap.Builder 中。 当我
我们目前正在将 Guava 用于其不可变集合,但我惊讶地发现他们的 map 没有方法可以轻松创建只需稍作修改的新 map 。最重要的是,他们的构建器不允许为键分配新值或删除键。 因此,如果我只想修改一
我一直在使用 Guava 的 ImmutableMap用Builder有一段时间没有考虑它是如何/为什么工作的。我一直按照 Javadoc 描述的方式使用生成器: ImmutableMap WORD_
我有一个返回 map 的方法。我最初会返回方法生成的 HashMap,但认为返回 ImmutableMap 会更好。不幸的是,以下语句拒绝在 eclipse 中工作: HashMap map = ne
我需要 Google Collection ImmutableMap 和 LinkedHashMap 的组合——具有定义迭代顺序的不可变映射。看来 ImmutableMap 本身其实已经定义了迭代顺序
当我序列化 HashMap 时,我可以保留类型信息,以便我可以将它反序列化为相应的类型,但这在序列化 com.google.common.collect 时不起作用.ImmutableMap。如何保留
这个问题在这里已经有了答案: Java 8 collector for Guava immutable collections? (5 个回答) 6年前关闭。 我发现自己想要 Collectors.t
我在 Android 项目中使用 Guava 集合。刚刚注意到以下行为: 在 Activity1 中: Intent i = new Intent(this, Activity2.class); i.
我是一名优秀的程序员,十分优秀!