Spec-Zone.ru › OpenJDK 25

Интерфейс 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

Краткое описание вложенных классов

Вложенные классы и интерфейсы, объявленные в интерфейсе Map

Map.Entry<K,V>

Краткое описание методов

Модификатор и тип Метод Описание
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)
Если значение для указанного ключа присутствует и не равно null, пытается вычислить новое сопоставление на основе ключа и текущего сопоставленного ему значения (необязательная операция).
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)
Заменяет значение каждой записи результатом вызова указанной функции для этой записи, пока не будут обработаны все записи или функция не вызовет исключение (необязательная операция).

Методы, объявленные в интерфейсе Map

clear, containsKey, containsValue, entrySet, equals, get, hashCode, isEmpty, keySet, put, putAll, remove, size, values

Подробное описание методов

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, пытается вычислить новое сопоставление на основе ключа и текущего сопоставленного ему значения (необязательная операция).

Если функция пересопоставления возвращает 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, сопоставляет ему заданное ненулевое значение (необязательная операция). В противном случае заменяет сопоставленное значение результатом функции пересопоставления или удаляет его, если результат равен 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

Сообщить об ошибке или предложить улучшение
Дополнительные справочные материалы по API и документацию для разработчиков см. в разделе Документация Java SE, содержащем более подробные описания для разработчиков, в том числе концептуальные обзоры, определения терминов, обходные решения и примеры работающего кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или ее аффилированных лиц в США и других странах.
Авторские права © 1993, 2025, Oracle и/или ее аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API