ConcurrentMap的JavaDoc - putIfAbsent说:
/**
* If the specified key is not already associated
* with a value, associate it with the given value.
* This is equivalent to
*
* if (!map.containsKey(key))
* return map.put(key, value);
* else
* return map.get(key);
*
* except that the action is performed atomically.
*/
但putIfAbsent(来自ConcurrentMap)和put(来自Map)返回前一个值(或者没有前一个值时返回null)。因此,在示例中,当映射不包含键时,返回null。这是代码的正确意图吗?返回“价值”不是更好吗?
答案 0 :(得分:1)
很可能API是以这种方式设计的,因此您可以区分以前没有映射(并且更新成功)的情况以及先前的映射存在但映射到完全相同的value
。< / p>
询问这是否比获取新值更实际没有帮助。我偶尔偶然发现了这种行为。但是,自从Java 5以来,API以这种方式指定,并且不会被更改。
作为旁注,如果不存在先前的映射,则Java 8的Map.computeIfAbsent
将表现得更像您期望的返回计算值。
答案 1 :(得分:0)
您已经(或应该)拥有新值。没有理由退回刚插入的内容。
ConcurrentMap<Integer, String> map = new ConcurrentHashMap<>();
...
String newVal = "someString";
String old = map.putIfAbsent(1, newVal);
if(old == null){
//no previous mapping
}