ConcurrentMap
将putIfAbsent()
的返回值指定为:
与指定键关联的先前值;如果键没有映射,则为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。