最佳答案
我一直在使用 Java 的 ConcurrentMap 来实现一个可以从多个线程使用的映射。PutIfAbsent 是一个很好的方法,并且比使用标准的 map 操作更容易读/写。我有一些这样的代码:
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 的最佳实践是什么?