Интерфейс ConcurrentMap<K, V>
- Параметры типа:
K- тип ключей, хранящихся в этой картеV- тип сопоставленных значений
- Все суперинтерфейсы:
Map<K,V>
- Все известные подинтерфейсы:
ConcurrentNavigableMap<K,V>
- Все известные реализующие классы:
ConcurrentHashMap, ConcurrentSkipListMap
public interface ConcurrentMap<K,V> extends Map<K,V>
Map, обеспечивающий гарантии потокобезопасности и атомарности. Для соблюдения указанных гарантий реализации этого интерфейса должны переопределять реализации методов по умолчанию, включая putIfAbsent(K, V), унаследованные от Map. Аналогичным образом реализации коллекций, возвращаемых методами Map.keySet(), Map.values() и Map.entrySet(), должны при необходимости переопределять такие методы, как removeIf, чтобы сохранить гарантии атомарности.
Эффекты согласованности памяти: как и в случае с другими параллельными коллекциями, действия в потоке, предшествующие помещению объекта в ConcurrentMap в качестве ключа или значения, происходят до действий, следующих за обращением к этому объекту или его удалением из ConcurrentMap в другом потоке.
Этот интерфейс является частью Java Collections Framework.
- С версии:
- 1.5
Краткое описание вложенных классов
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
default V |
compute |
Пытается вычислить сопоставление для указанного ключа и текущего сопоставленного ему значения либо null, если сопоставления в данный момент нет (необязательная операция). |
default V |
computeIfAbsent |
Если указанному ключу еще не сопоставлено значение (или ему сопоставлено null), пытается вычислить его значение с помощью заданной функции сопоставления и добавляет его в эту карту, если только null (необязательная операция). |
default V |
computeIfPresent |
Если значение для указанного ключа присутствует и не равно null, пытается вычислить новое сопоставление на основе ключа и текущего сопоставленного ему значения (необязательная операция). |
default void |
forEach |
Выполняет указанное действие для каждой записи этой карты, пока не будут обработаны все записи или действие не вызовет исключение. |
default V |
getOrDefault |
Возвращает значение, сопоставленное указанному ключу, или defaultValue, если в этой карте нет сопоставления для ключа. |
default V |
merge |
Если указанному ключу еще не сопоставлено значение или ему сопоставлено значение null, сопоставляет ему заданное ненулевое значение (необязательная операция). |
V |
putIfAbsent |
Если указанному ключу еще не сопоставлено значение, сопоставляет ему заданное значение. |
boolean |
remove |
Удаляет запись для ключа только в том случае, если ему в данный момент сопоставлено заданное значение. |
V |
replace |
Заменяет запись для ключа только в том случае, если ему в данный момент сопоставлено какое-либо значение. |
boolean |
replace |
Заменяет запись для ключа только в том случае, если ему в данный момент сопоставлено заданное значение. |
default void |
replaceAll |
Заменяет значение каждой записи результатом вызова указанной функции для этой записи, пока не будут обработаны все записи или функция не вызовет исключение (необязательная операция). |
Подробное описание методов
getOrDefault
default V getOrDefault(Object key, V defaultValue)
defaultValue, если в этой карте нет сопоставления для ключа.- Объявлен в:
-
getOrDefaultв интерфейсеMap<K,V> - Примечание по реализации:
- Эта реализация предполагает, что ConcurrentMap не может содержать значения null и
get()возврат null однозначно означает, что ключ отсутствует. Реализации, поддерживающие значения null, должны переопределить эту реализацию по умолчанию. - Параметры:
-
key- ключ, значение которого требуется вернуть -
defaultValue- значение по умолчанию для ключа - Возвращает:
- значение, сопоставленное указанному ключу, или
defaultValue, если в этой карте нет сопоставления для ключа - Исключения:
-
ClassCastException- если ключ имеет недопустимый для этой карты тип (необязательно) -
NullPointerException- если указанный ключ равен null, а эта карта не допускает ключи null (необязательно) - С версии:
- 1.8
forEach
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- если указанное действие равно null - С версии:
- 1.8
putIfAbsent
V putIfAbsent(K key, V value)
map это эквивалентно следующему: if (!map.containsKey(key))
return map.put(key, value);
else
return map.get(key);, за исключением того, что действие выполняется атомарно.- Объявлен в:
-
putIfAbsentв интерфейсеMap<K,V> - Примечание по реализации:
- Эта реализация намеренно повторно объявляет абстрактным неподходящий метод по умолчанию, предоставленный в
Map. - Параметры:
-
key- ключ, с которым требуется связать указанное значение -
value- значение, которое требуется связать с указанным ключом - Возвращает:
- предыдущее значение, сопоставленное указанному ключу, или
null, если для ключа не было сопоставления. (Возвращаемое значениеnullтакже может означать, что ранее карта сопоставлялаnullс ключом, если реализация поддерживает значения null.) - Исключения:
-
UnsupportedOperationException- если эта карта не поддерживает операциюput -
ClassCastException- если класс указанного ключа или значения не позволяет сохранить его в этой карте -
NullPointerException- если указанный ключ или значение равны null, а эта карта не допускает ключи или значения null -
IllegalArgumentException- если некоторое свойство указанного ключа или значения не позволяет сохранить его в этой карте
remove
boolean remove(Object key, Object value)
map это эквивалентно следующему: 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- если ключ или значение имеет недопустимый для этой карты тип (необязательно) -
NullPointerException- если указанный ключ или значение равны null, а эта карта не допускает ключи или значения null (необязательно)
replace
boolean replace(K key, V oldValue, V newValue)
map это эквивалентно следующему: 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- если указанный ключ или значение равны null, а эта карта не допускает ключи или значения null -
IllegalArgumentException- если некоторое свойство указанного ключа или значения не позволяет сохранить его в этой карте
replace
V replace(K key, V value)
map это эквивалентно следующему: if (map.containsKey(key))
return map.put(key, value);
else
return null;, за исключением того, что действие выполняется атомарно.- Объявлен в:
-
replaceв интерфейсеMap<K,V> - Примечание по реализации:
- Эта реализация намеренно повторно объявляет абстрактным неподходящий метод по умолчанию, предоставленный в
Map. - Параметры:
-
key- ключ, с которым связано указанное значение -
value- значение, которое требуется связать с указанным ключом - Возвращает:
- предыдущее значение, сопоставленное указанному ключу, или
null, если для ключа не было сопоставления. (Возвращаемое значениеnullтакже может означать, что ранее карта сопоставлялаnullс ключом, если реализация поддерживает значения null.) - Исключения:
-
UnsupportedOperationException- если эта карта не поддерживает операциюput -
ClassCastException- если класс указанного ключа или значения не позволяет сохранить его в этой карте -
NullPointerException- если указанный ключ или значение равны null, а эта карта не допускает ключи или значения null -
IllegalArgumentException- если некоторое свойство указанного ключа или значения не позволяет сохранить его в этой карте
replaceAll
default void replaceAll(BiFunction<? super K, ? super V, ? extends V> function)
- Объявлен в:
-
replaceAllв интерфейсеMap<K,V> - Требования к реализации:
-
Реализация по умолчанию эквивалентна следующему для этого
map:
Реализация по умолчанию может повторять эти шаги, если несколько потоков пытаются выполнить обновления, в том числе потенциально вызывая функцию повторно для заданного ключа.for (Map.Entry<K,V> entry : map.entrySet()) { K k; V v; do { k = entry.getKey(); v = entry.getValue(); } while (!map.replace(k, v, function.apply(k, v))); }Эта реализация предполагает, что ConcurrentMap не может содержать значения null и
get()возврат null однозначно означает, что ключ отсутствует. Реализации, поддерживающие значения null, должны переопределить эту реализацию по умолчанию. - Параметры:
-
function- функция, применяемая к каждой записи - Исключения:
-
UnsupportedOperationException- если эта карта не поддерживает операциюreplaceAll(необязательно) -
NullPointerException- если указанная функция равна null или если новое значение равно null, а эта карта не допускает значения null (необязательно) -
ClassCastException- если класс нового значения не позволяет сохранить его в этой карте (необязательно) -
IllegalArgumentException- если некоторое свойство нового значения не позволяет сохранить его в этой карте (необязательно) - С версии:
- 1.8
computeIfAbsent
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:V oldValue, newValue; return ((oldValue = map.get(key)) == null && (newValue = mappingFunction.apply(key)) != null && (oldValue = map.putIfAbsent(key, newValue)) == null) ? newValue : oldValue;Эта реализация предполагает, что ConcurrentMap не может содержать значения null и
get()возврат null однозначно означает, что ключ отсутствует. Реализации, поддерживающие значения null, должны переопределить эту реализацию по умолчанию. - Параметры:
-
key- ключ, с которым требуется связать указанное значение -
mappingFunction- функция сопоставления для вычисления значения - Возвращает:
- текущее (существующее или вычисленное) значение, сопоставленное указанному ключу, или null, если вычисленное значение равно null
- Исключения:
-
UnsupportedOperationException- если эта карта не поддерживает операциюcomputeIfAbsent(необязательно) -
ClassCastException- если класс указанного ключа или значения не позволяет сохранить его в этой карте (необязательно) -
NullPointerException- если указанный ключ равен null, а эта карта не поддерживает ключи null, или если mappingFunction равна null -
IllegalArgumentException- если некоторое свойство указанного ключа или значения не позволяет сохранить его в этой карте (необязательно) - С версии:
- 1.8
computeIfPresent
default V computeIfPresent(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)
Если функция пересопоставления возвращает null, сопоставление удаляется. Если сама функция пересопоставления вызывает непроверяемое исключение, оно повторно выбрасывается, а текущее сопоставление остается без изменений.
Во время вычисления функция пересопоставления не должна изменять эту карту.
- Объявлен в:
-
computeIfPresentв интерфейсеMap<K,V> - Требования к реализации:
- Реализация по умолчанию эквивалентна выполнению следующих шагов для этого
map:
При попытках обновления несколькими потоками операции с картой и функция пересопоставления могут вызываться несколько раз.for (V oldValue; (oldValue = map.get(key)) != null; ) { V newValue = remappingFunction.apply(key, oldValue); if ((newValue == null) ? map.remove(key, oldValue) : map.replace(key, oldValue, newValue)) return newValue; } return null;Эта реализация предполагает, что ConcurrentMap не может содержать значения null и
get()возврат null однозначно означает, что ключ отсутствует. Реализации, поддерживающие значения null, должны переопределить эту реализацию по умолчанию. - Параметры:
-
key- ключ, с которым требуется связать указанное значение -
remappingFunction- функция пересопоставления для вычисления значения - Возвращает:
- новое значение, сопоставленное указанному ключу, или null, если такого значения нет
- Исключения:
-
UnsupportedOperationException- если эта карта не поддерживает операциюcomputeIfPresent(необязательно) -
ClassCastException- если класс указанного ключа или значения не позволяет сохранить его в этой карте (необязательно) -
NullPointerException- если указанный ключ равен null, а эта карта не поддерживает ключи null, или если remappingFunction равна null -
IllegalArgumentException- если некоторое свойство указанного ключа или значения не позволяет сохранить его в этой карте (необязательно) - С версии:
- 1.8
compute
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:
При попытках обновления несколькими потоками операции с картой и функция пересопоставления могут вызываться несколько раз.for (;;) { V oldValue = map.get(key); V newValue = remappingFunction.apply(key, oldValue); if (newValue != null) { if ((oldValue != null) ? map.replace(key, oldValue, newValue) : map.putIfAbsent(key, newValue) == null) return newValue; } else if (oldValue == null || map.remove(key, oldValue)) { return null; } }Эта реализация предполагает, что ConcurrentMap не может содержать значения null и
get()возврат null однозначно означает, что ключ отсутствует. Реализации, поддерживающие значения null, должны переопределить эту реализацию по умолчанию. - Параметры:
-
key- ключ, с которым требуется связать указанное значение -
remappingFunction- функция пересопоставления для вычисления значения - Возвращает:
- новое значение, сопоставленное указанному ключу, или null, если такого значения нет
- Исключения:
-
UnsupportedOperationException- если эта карта не поддерживает операциюcompute(необязательно) -
ClassCastException- если класс указанного ключа или значения не позволяет сохранить его в этой карте (необязательно) -
NullPointerException- если указанный ключ равен null, а эта карта не поддерживает ключи null, или если remappingFunction равна null -
IllegalArgumentException- если некоторое свойство указанного ключа или значения не позволяет сохранить его в этой карте (необязательно) - С версии:
- 1.8
merge
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:
При попытках обновления несколькими потоками операции с картой и функция пересопоставления могут вызываться несколько раз.for (;;) { V oldValue = map.get(key); if (oldValue != null) { V newValue = remappingFunction.apply(oldValue, value); if (newValue != null) { if (map.replace(key, oldValue, newValue)) return newValue; } else if (map.remove(key, oldValue)) { return null; } } else if (map.putIfAbsent(key, value) == null) { return value; } }Эта реализация предполагает, что ConcurrentMap не может содержать значения null и
get()возврат null однозначно означает, что ключ отсутствует. Реализации, поддерживающие значения null, должны переопределить эту реализацию по умолчанию. - Параметры:
-
key- ключ, с которым требуется связать результирующее значение -
value- ненулевое значение, которое требуется объединить с существующим значением, сопоставленным ключу, или сопоставить ключу, если для него нет существующего значения либо ему сопоставлено значение null -
remappingFunction- функция пересопоставления для повторного вычисления значения, если оно присутствует - Возвращает:
- новое значение, сопоставленное указанному ключу, или null, если ключу не сопоставлено значение
- Исключения:
-
UnsupportedOperationException- если эта карта не поддерживает операциюmerge(необязательно) -
ClassCastException- если класс указанного ключа или значения не позволяет сохранить его в этой карте (необязательно) -
NullPointerException- если указанный ключ равен null, а эта карта не поддерживает ключи null, либо если значение или remappingFunction равны null -
IllegalArgumentException- если некоторое свойство указанного ключа или значения не позволяет сохранить его в этой карте (необязательно) - С версии:
- 1.8
© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/concurrent/ConcurrentMap.html