在使用 ConcurrentMap 的 putIfAbsent 之前,是否应该检查映射是否包含Key
我一直在使用Java的ConcurrentMap作为可以从多个线程使用的映射。putIfAbsent 是一个很好的方法,读/写比使用标准映射操作容易得多。我有一些代码看起来像这样:
ConcurrentMap<String, Set<X>> map = new ConcurrentHashMap<String, Set<X>>();
// ...
map.putIfAbsent(name, new HashSet<X>());
map.get(name).add(Y);
可读性方面,这很好,但它确实需要每次都创建一个新的哈希集,即使它已经在地图中。我可以这样写:
if (!map.containsKey(name)) {
map.putIfAbsent(name, new HashSet<X>());
}
map.get(name).add(Y);
通过此更改,它会失去一些可读性,但不需要每次都创建HashSet。在这种情况下哪个更好?我倾向于支持第一个,因为它更具可读性。第二个会表现得更好,可能更正确。也许有比这两种更好的方法来做到这一点。
以这种方式使用 putIfAbsent 的最佳做法是什么?