K
-钥匙的Map保持型
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 ),尝试使用给定的映射功能,进入到这个Map除非
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 如果这个Map不包含的键映射。
|
default V |
merge(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction)
如果指定的键已与值相关联的值或与空值相关联的,则将其与给定的非空值关联。
|
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
如果这个Map不包含的键映射。
getOrDefault
接口
Map<K,V>
get()
明确意味着重点不在。实现支持空值
必须重写此默认实现。
key
-关键的相关值被返回
defaultValue
-键的默认映射
defaultValue
如果这个Map不包含的键映射
ClassCastException
如果关键是这张图的不恰当的类型(
optional)
NullPointerException
-如果指定的键是无效的,这张Map不允许null键(
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
如果没有键映射。(一
null
返回也表明,与先前的
null
Map的关键,如果实施支持空值。)
UnsupportedOperationException
-如果
put
操作不该Map支持
ClassCastException
如果类指定的键或值防止它被存储在这个Map
NullPointerException
-如果指定的键或值是null,这Map不允许null键或值
IllegalArgumentException
如果一些属性指定的键或值防止它被存储在这个Map
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
操作不该Map支持
ClassCastException
如果键或值是此Map不合适的类型(
optional)
NullPointerException
-如果指定的键或值是null,这Map不允许null键或值(
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
操作不该Map支持
ClassCastException
如果类指定的键或值,防止它被存储在这个Map
NullPointerException
-如果指定的键或值是null,这Map不允许null键或值
IllegalArgumentException
如果一些属性指定的键或值,防止它被存储在这个Map
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
如果没有键映射。(一
null
返回也表明,与先前的
null
Map的关键,如果实施支持空值。)
UnsupportedOperationException
-如果
put
操作不该Map支持
ClassCastException
如果类指定的键或值防止它被存储在这个Map
NullPointerException
-如果指定的键或值是null,这Map不允许null键或值
IllegalArgumentException
如果一些属性指定的键或值防止它被存储在这个Map
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不能包含空值,返回null get()
明确意味着重点不在。实现支持空值必须重写此默认实现。
function
-功能适用于每一个条目
UnsupportedOperationException
-如果
set
操作不该Map的输入迭代器支持集。
NullPointerException
如果函数或替换值是null,这Map不允许null键或值(
optional)
ClassCastException
如果替换值是此Map不合适的类型(
optional)
IllegalArgumentException
如果替换值的一些性质防止它被存储在这个Map(
optional)
default V computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction)
null
),尝试使用给定的映射功能,进入到这个Map除非
null
计算其价值。
如果函数返回null
没有映射记录。如果函数抛出一个(没有)异常,异常会被重新抛出,没有映射记录。最常见的用法是构造一个新对象作为初始映射值或memoized的结果,如:
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不能包含空值,返回null get()
明确意味着重点不在。实现支持空值必须重写此默认实现。
key
键与指定的值是相关联的
mappingFunction
的函数来计算一个值
UnsupportedOperationException
-如果
put
操作不该Map支持(
optional)
ClassCastException
如果类指定的键或值防止它被存储在这个Map(
optional)
NullPointerException
-如果指定的键是无效的,这张Map不支持null键,或映射函数是空的
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不能包含空值,返回null get()
明确意味着重点不在。实现支持空值必须重写此默认实现。
key
键与指定的值是相关联的
remappingFunction
的函数来计算一个值
UnsupportedOperationException
-如果
put
操作不该Map支持(
optional)
ClassCastException
如果类指定的键或值防止它被存储在这个Map(
optional)
NullPointerException
-如果指定的键是无效的,这张Map不支持null键,或remappingfunction是空的
default V compute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction)
null
如果没有当前映射)。例如,可以创建或追加
String
味精到值的映射:
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不能包含空值,返回null get()
明确意味着重点不在。实现支持空值必须重写此默认实现。
key
键与指定的值是相关联的
remappingFunction
的函数来计算一个值
UnsupportedOperationException
-如果
put
操作不该Map支持(
optional)
ClassCastException
如果类指定的键或值防止它被存储在这个Map(
optional)
NullPointerException
-如果指定的键是无效的,这张Map不支持null键,或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不能包含空值,返回null get()
明确意味着重点不在。实现支持空值必须重写此默认实现。
key
键,得到的值是相关联的
value
-非空值是与存在价值的关键或相关的合并,如果没有存在的价值或空值与密钥相关的,是与密钥相关的
remappingFunction
-函数重新计算值如果存在
UnsupportedOperationException
-如果
put
操作不该Map支持(
optional)
ClassCastException
如果类指定的键或值防止它被存储在这个Map(
optional)
NullPointerException
-如果指定的键是无效的,这张Map不支持null键或值或remappingfunction是空的
Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.