ConcurrentMapputIfAbsent()的返回值指定为:


  与指定键关联的先前值;如果键没有映射,则为null。 (如果实现支持空值,则返回null还可表示映射先前将null与键相关联。)


并给出以下代码作为示例。

if (!map.containsKey(key))
    return map.put(key, value);
else
    return map.get(key);
}


问题是,如果仅在映射中不存在具有给定键的条目的情况下调用map.put(key, value),怎么会有一个先前的值?在我看来,如果在调用putIfAbsent()之前不存在具有给定键的条目,它将始终返回当前值或null。

最佳答案

考虑以下几行:

ConcurrentMap<String, String> map = new ConcurrentHashMap<>();
System.out.println(map.putIfAbsent("key", "value1")); // prints null (no previous value)
System.out.println(map.putIfAbsent("key", "value2")); // prints "value1"


在第一次调用putIfAbsent时,没有与键key关联的值。因此,putIfAbsent将返回null如所记录。

在第二次调用时,putIfAbsent将返回先前的映射,即value1,并且该值已存在,因此不会在映射中更新。

虽然的确存在,如果该键存在映射,则putIfAbsent总是会返回当前值,但此处引入的“先前值”的概念与Map.put的定义一致,后者会返回先前的值。引用其Javadoc:


  与key关联的先前值;如果没有key映射,则为null。

09-09 22:22