K
- 由此地图维护的键的类型
V
- 映射值的类型
public interface ConcurrentMap<K,V> extends Map<K,V>
Map
提供线程安全和原子性保证。
内存一致性效果:与其他并发集合一样,在将对象放入ConcurrentMap
作为键或happen-before之前的线程中的操作,在另一个线程中从ConcurrentMap
访问或删除该对象之后。
此接口是成员Java Collections Framework 。
Modifier and Type | Method and Description |
---|---|
default V |
compute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction)
尝试计算指定密钥及其当前映射值的映射(如果没有当前映射,
null )。
|
default V |
computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction)
如果指定的键尚未与值相关联(或映射到
null ),则尝试使用给定的映射函数计算其值,并将其输入到此映射中,除非
null 。
|
default V |
computeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction)
如果指定的密钥的值存在且非空,则尝试计算给定密钥及其当前映射值的新映射。
|
default void |
forEach(BiConsumer<? super K,? super V> action)
对此映射中的每个条目执行给定的操作,直到所有条目都被处理或操作引发异常。
|
default V |
getOrDefault(Object key, V defaultValue)
返回到指定键所映射的值,或
defaultValue 如果此映射包含该键的映射。
|
default V |
merge(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction)
如果指定的键尚未与值相关联或与null相关联,则将其与给定的非空值相关联。
|
V |
putIfAbsent(K key, V value)
如果指定的键尚未与值相关联,请将其与给定值相关联。
|
boolean |
remove(Object key, Object value)
仅当当前映射到给定值时才删除密钥的条目。
|
V |
replace(K key, V value)
仅当当前映射到某个值时才替换该项的条目。
|
boolean |
replace(K key, V oldValue, V newValue)
仅当当前映射到给定值时才替换密钥的条目。
|
default void |
replaceAll(BiFunction<? super K,? super V,? extends V> function)
将每个条目的值替换为对该条目调用给定函数的结果,直到所有条目都被处理或该函数抛出异常。
|
default V getOrDefault(Object key, V defaultValue)
defaultValue
如果此映射包含该键的映射。
getOrDefault
在界面
Map<K,V>
get()
get()返回null明确表示该键不存在。
支持空值的实现必须覆盖此默认实现。
key
- 要返回其关联值的键
defaultValue
- 键的默认映射
defaultValue
ClassCastException
- 如果密钥是该地图的不当类型(
optional )
NullPointerException
- 如果指定的键为空,并且此映射不允许空键(
optional )
default void forEach(BiConsumer<? super K,? super V> action)
forEach
中的
Map<K,V>
map
:
for ((Map.Entry<K, V> entry : map.entrySet()) action.accept(entry.getKey(), entry.getValue());
IllegalStateException
通过抛出getKey()
或getValue()
表示该条目已被删除,无法处理。
继续进行操作。
action
- 为每个条目执行的操作
NullPointerException
- 如果指定的动作为空
V putIfAbsent(K key, V value)
if (!map.containsKey(key)) return map.put(key, value); else return map.get(key);
除了动作以原子方式执行。
putIfAbsent
在界面
Map<K,V>
Map
。
key
- 指定值与之关联的键
value
- 与指定键相关联的值
null
。
(A null
返回也可以指示映射以前关联的是null
的关键字,如果实现支持空值)。
UnsupportedOperationException
-如果
put
操作不受此地图支持
ClassCastException
- 如果指定的键或值的类阻止它存储在此映射中
NullPointerException
- 如果指定的键或值为空,并且此映射不允许空值或值
IllegalArgumentException
- 如果指定键或值的某些属性阻止其存储在此映射中
boolean remove(Object key, Object value)
if (map.containsKey(key) && Objects.equals(map.get(key), value)) { map.remove(key); return true; } else return false;
除了动作以原子方式执行。
remove
在界面
Map<K,V>
Map
。
key
- 与指定值相关联的键
value
- 预期与指定键相关联的值
true
如果该值被删除
UnsupportedOperationException
-如果
remove
操作不受此地图支持
ClassCastException
- 如果该地图的键或值不合适(
optional )
NullPointerException
- 如果指定的键或值为空,并且此映射不允许空键或值(
optional )
boolean replace(K key, V oldValue, V newValue)
if (map.containsKey(key) && Objects.equals(map.get(key), oldValue)) { map.put(key, newValue); return true; } else return false;
除了动作以原子方式执行。
replace
在界面
Map<K,V>
Map
。
key
- 与指定值相关联的键
oldValue
- 预期与指定键相关联的值
newValue
- 与指定键相关联的值
true
如果该值被替换
UnsupportedOperationException
-如果
put
操作不受此地图支持
ClassCastException
- 如果指定的键或值的类阻止它存储在此映射中
NullPointerException
- 如果指定的键或值为空,并且此映射不允许空值或值
IllegalArgumentException
- 如果指定键或值的某些属性阻止其存储在此映射中
V replace(K key, V value)
if (map.containsKey(key)) { return map.put(key, value); } else return null;
除了动作以原子方式执行。
replace
在界面
Map<K,V>
Map
。
key
- 与指定值相关联的键
value
- 与指定键相关联的值
null
。
(A null
返回也可以指示该映射先前关联的是null
与密钥,如果实现支持null值。)
UnsupportedOperationException
-如果
put
操作不受此地图支持
ClassCastException
- 如果指定的键或值的类阻止它存储在此映射中
NullPointerException
- 如果指定的键或值为空,并且此映射不允许空键或值
IllegalArgumentException
- 如果指定键或值的某些属性阻止其存储在此映射中
default void replaceAll(BiFunction<? super K,? super V,? extends V> function)
replaceAll
中的
Map<K,V>
默认实现相当于,对于这个map
:
for ((Map.Entry<K, V> entry : map.entrySet()) do { K k = entry.getKey(); V v = entry.getValue(); } while(!replace(k, v, function.apply(k, v)));
当多个线程尝试更新时,默认实现可能会重试这些步骤,包括针对给定的密钥重复地调用该功能。
此实现假定ConcurrentMap不能包含空值, get()
get()返回null是明确的,意味着该键不存在。 支持空值的实现必须覆盖此默认实现。
function
- 应用于每个条目的功能
UnsupportedOperationException
-如果
set
操作不受此映射的条目集迭代器的支持。
NullPointerException
- 如果函数或替换值为空,并且此映射不允许空值或值(
optional )
ClassCastException
- 如果替代值对于该地图是不合适的类型(
optional )
IllegalArgumentException
- 如果替换值的某些属性阻止其存储在此映射中(
optional )
default V computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction)
null
),则尝试使用给定的映射函数计算其值,并将其输入到此映射中,除非null
。
如果函数返回null
则不记录映射。 如果函数本身引发(未检查)异常,则异常被重新引导,并且不记录映射。 最常见的用法是构造一个用作初始映射值或记忆结果的新对象,如:
map.computeIfAbsent(key, k -> new Value(f(k)));
或者实现一个多值地图, Map<K,Collection<V>>
,支持多个值每个键:
map.computeIfAbsent(key, k -> new HashSet<V>()).add(v);
computeIfAbsent
在界面
Map<K,V>
map
,然后返回当前值或null
如果现在缺席:
if (map.get(key) == null) { V newValue = mappingFunction.apply(key); if (newValue != null) return map.putIfAbsent(key, newValue); }
当多个线程尝试更新(包括潜在地调用映射函数多次)时,默认实现可能会重试这些步骤。
这个实现假定ConcurrentMap不能包含空值, get()
get()返回null明确地表示密钥不存在。 支持空值的实现必须覆盖此默认实现。
key
- 指定值与之关联的键
mappingFunction
- 计算值的函数
UnsupportedOperationException
-如果
put
操作不受此地图支持(
optional )
ClassCastException
- 如果指定的键或值的类阻止它存储在此映射中(
optional )
NullPointerException
- 如果指定的键为空,此映射不支持空键,或者mappingFunction为空
default V computeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction)
如果函数返回null
,则映射将被删除。 如果函数本身引发(未检查)异常,则异常被重新引导,并且当前映射保持不变。
computeIfPresent
中的
Map<K,V>
map
,然后返回当前值或null
,如果现在不存在的。
:
if (map.get(key) != null) { V oldValue = map.get(key); V newValue = remappingFunction.apply(key, oldValue); if (newValue != null) map.replace(key, oldValue, newValue); else map.remove(key, oldValue); }
当多个线程尝试更新时,默认实现可能会重试这些步骤,包括多次重复映射功能。
此实现假定ConcurrentMap不能包含空值, get()
明确地返回null表示密钥不存在。 支持空值的实现必须覆盖此默认实现。
key
- 指定值与之关联的键
remappingFunction
- 计算值的函数
UnsupportedOperationException
-如果
put
操作不受此地图支持(
optional )
ClassCastException
- 如果指定的键或值的类阻止它存储在此映射中(
optional )
NullPointerException
- 如果指定的键为空,此映射不支持空键,或者remappingFunction为空
default V compute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction)
null
如果没有当前映射)。
例如,要为值映射创建或附加一个String
msg:
map.compute(key, (k, v) -> (v == null) ? msg : v.concat(msg))
(方法merge()
通常更容易用于此目的。)
如果函数返回null
,则映射将被删除(如果最初缺少,则保持不存在)。 如果函数本身引发(未检查)异常,则异常被重新引导,并且当前映射保持不变。
compute
在界面
Map<K,V>
map
,然后返回当前值或null
如果缺席:
V oldValue = map.get(key); V newValue = remappingFunction.apply(key, oldValue); if (oldValue != null ) { if (newValue != null) map.replace(key, oldValue, newValue); else map.remove(key, oldValue); } else { if (newValue != null) map.putIfAbsent(key, newValue); else return null; }
当多个线程尝试更新时,默认实现可能会重试这些步骤,包括多次重复映射功能。
此实现假定ConcurrentMap不能包含空值,而get()
明确地返回null表示密钥不存在。 支持空值的实现必须覆盖此默认实现。
key
- 指定值与之关联的键
remappingFunction
- 计算值的函数
UnsupportedOperationException
-如果
put
操作不受此地图支持(
optional )
ClassCastException
- 如果指定的键或值的类阻止它存储在此映射中(
optional )
NullPointerException
- 如果指定的键为空,此映射不支持空键,或者remappingFunction为空
default V merge(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction)
null
。
当组合键的多个映射值时,该方法可能是有用的。
例如,要创建或追加String msg
到值映射:
map.merge(key, msg, String::concat)
如果函数返回null
,则删除该映射。 如果函数本身引发(未检查)异常,则异常被重新引导,并且当前映射保持不变。
merge
在界面
Map<K,V>
map
,然后返回当前值或null
如果缺席:
V oldValue = map.get(key); V newValue = (oldValue == null) ? value : remappingFunction.apply(oldValue, value); if (newValue == null) map.remove(key); else map.put(key, newValue);
当多个线程尝试更新时,默认实现可能会重试这些步骤,包括多次重复映射功能。
此实现假定ConcurrentMap不能包含空值, get()
get()返回null是明确的,表示密钥不存在。 支持空值的实现必须覆盖此默认实现。
key
- 与结果值相关联的键
value
- 要与与密钥相关联的现有值合并的非空值,或者如果没有与密钥相关联的现有值或空值与密钥相关联
remappingFunction
- 重新计算值(如果存在)的函数
UnsupportedOperationException
-如果
put
操作不受此地图支持(
optional )
ClassCastException
- 如果指定的键或值的类阻止它存储在此映射中(
optional )
NullPointerException
- 如果指定的键为空,并且此映射不支持空键或值或remappingFunction为空