我一直在使用Java的ConcurrentMap作为可从多个线程使用的地图。putIfAbsent是一种很棒的方法,比使用标准映射操作更容易读/写。我有一些看起来像这样的代码:
ConcurrentMap<String, Set<X>> map = new ConcurrentHashMap<String, Set<X>>();
// ...
map.putIfAbsent(name, new HashSet<X>());
map.get(name).add(Y);
在可读性方面,这很棒,但是每次都确实需要创建一个新的HashSet,即使它已经在地图中也是如此。我可以这样写:
if (!map.containsKey(name)) {
map.putIfAbsent(name, new HashSet<X>());
}
map.get(name).add(Y);
进行此更改后,它会失去一些可读性,但无需每次都创建HashSet。在这种情况下哪个更好?我倾向于第一个,因为它更具可读性。第二个将表现更好,并且可能更正确。也许有比这两种方法更好的方法。
以这种方式使用putIfAbsent的最佳实践是什么?
并发很难。如果您要为并发映射而不是直接锁定而烦恼,则不妨这样做。确实,不要进行不必要的查找。
Set<X> set = map.get(name);
if (set == null) {
final Set<X> value = new HashSet<X>();
set = map.putIfAbsent(name, value);
if (set == null) {
set = value;
}
}
(通常的stackoverflow免责声明:超出我的头脑。未经测试。未经编译。等等。)
更新:
1.8已向中添加了computeIfAbsent
默认方法ConcurrentMap
(Map
这很有趣,因为该实现对错误ConcurrentMap
)。(并且1.7添加了“钻石算子”
<>
。)
Set<X> set = map.computeIfAbsent(name, n -> new HashSet<>());
(请注意,您应对HashSet
。中包含的的任何操作的线程安全负责ConcurrentMap
。)
在数千项从字符串转换为int的循环中,在调用Integer之前应该检查字符串是否为空。parseInt或应直接依赖NumberFormatException移动到下一个?
问题内容: 我知道我可以在地图迭代的, 并寻找钥匙,但是有没有更有效的方法来测试地图中钥匙的存在? 我在语言规范中找不到答案。 问题答案: 一线回答: 说明: Go中的语句可以同时包含条件和初始化语句。上面的示例同时使用: 初始化两个变量- 将从映射中接收“ foo”的值或从“零值”(在这种情况下为空字符串)接收值,并且将收到一个布尔值,如果在映射中实际存在“ foo” ,则该布尔值将设置为 计算
问题内容: 我正在实现是否有位图,那么它应该将图像从imageview保存到内部存储器,否则在应用程序的内部存储器中设置另一个位图。这是代码:_ 问题答案: 您可以按以下方式检查它: 只需检查Bitmap值,如下所示:
我在我的Java应用程序中使用Jackson JSON库及其Tree Model系统()。在这种情况下,我需要检查是否包含给定的。我正在浏览JavaDocs,并且没有看到的任何类型的方法。我最终自己写了一个包含方法: 单元测试: 我是否错过了杰克逊的一些东西,我正在复制一些我错过的图书馆方法。否则,还有比我做的更好的方法吗?
我有一种感觉,我在这件事上完全错了。但无论如何。 我有一个sql数据库,它本质上是一个有目的的非规范化表,我构造这个表是为了使这项任务对我来说更容易,所以我可以从一个表中获取内容。 我有一张成双成对的桌子,像这样: 等等 所以对于我的neo4j图数据库,我希望每个用户ID作为一个节点,其他的东西不是太重要,但基本上是关系中的东西。 我只希望每个用户有一个节点,所以我的感觉是,如果我这样做: 当我们
问题内容: Java8引入了这些不错的方法和,从而允许编写如下代码: 现在,我想知道是否有充分的事实理由可以这样做: 要么 两者都可以工作: 当 将元素添加到列表 时,选项1可能会进行很多不必要的“ put”调用 选项2可能做了很多不必要的“的containsKey”呼叫时 对新的密钥添加新条目 是主导 SO:“总是”选择选项1或选项2的充分理由是吗? 问题答案: 如果您想对替代值使用缺席值而不修