Интерфейс 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 не может содержать нулевые значения и
get()возвращение null однозначно означает, что ключ отсутствует. Реализации, которые поддерживают нулевые значения, обязаны переопределить эту реализацию по умолчанию. - Параметры:
-
key- ключ, связанное значение которого должно быть возвращено -
defaultValue- значение по умолчанию для ключа - Возвращает:
- значение, связанное с заданным ключом, или
defaultValue, если в этом отображении нет сопоставления для ключа - Выбрасывает:
-
ClassCastException- если ключ неподходящего типа для этого отображения (необязательно) -
NullPointerException- если указанный ключ равен 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с ключом, если реализация поддерживает нулевые значения.) - Выбрасывает:
-
UnsupportedOperationException- если операцияputне поддерживается этим отображением -
ClassCastException- если класс указанного ключа или значения препятствует его хранению в этом отображении -
NullPointerException- если указанный ключ или значение равно 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, а это отображение не допускает нулевых ключей или значений (необязательно)
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, а это отображение не допускает нулевых ключей или значений -
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с ключом, если реализация поддерживает нулевые значения.) - Выбрасывает:
-
UnsupportedOperationException- если операцияputне поддерживается этим отображением -
ClassCastException- если класс указанного ключа или значения препятствует его хранению в этом отображении -
NullPointerException- если указанный ключ или значение равно 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 не может содержать нулевых значений и
get()возвращение null однозначно означает, что ключ отсутствует. Реализации, которые поддерживают нулевые значения, обязаны переопределить эту реализацию по умолчанию. - Параметры:
-
function- функция, применяемая к каждой записи - Выбрасывает:
-
UnsupportedOperationException- если операцияsetне поддерживается итератором набора записей этого отображения. -
NullPointerException- если указанная функция равна 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 не может содержать нулевые значения и
get()возвращение null однозначно означает, что ключ отсутствует. Реализации, которые поддерживают нулевые значения, должны переопределить эту реализацию по умолчанию. - Параметры:
-
key- ключ, с которым должно быть связано указанное значение -
mappingFunction- функция отображения для вычисления значения - Возвращает:
- текущее (существующее или вычисленное) значение, связанное с указанным ключом, или null, если вычисленное значение равно null
- Исключения:
-
UnsupportedOperationException- если операцияputне поддерживается этой картой (необязательно) -
ClassCastException- если класс указанного ключа или значения не позволяет его хранение в этой карте (необязательно) -
NullPointerException- если указанный ключ равен 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 не может содержать нулевые значения и
get()возвращение null однозначно означает, что ключ отсутствует. Реализации, которые поддерживают нулевые значения, должны переопределить эту реализацию по умолчанию. - Параметры:
-
key- ключ, с которым должно быть связано указанное значение -
remappingFunction- функция переопределения для вычисления значения - Возвращает:
- новое значение, связанное с указанным ключом, или null, если нет
- Исключения:
-
UnsupportedOperationException- если операцияputне поддерживается этой картой (необязательно) -
ClassCastException- если класс указанного ключа или значения не позволяет его хранение в этой карте (необязательно) -
NullPointerException- если указанный ключ равен null, и эта карта не поддерживает нулевые ключи, или remappingFunction равен null -
IllegalArgumentException- если некоторые свойства указанного ключа или значения не позволяют его хранение в этой карте (необязательно) - С:
- 1.8
compute
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:
Когда несколько потоков пытаются выполнить обновления, операции с картой и функция переопределения могут вызываться несколько раз.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 не может содержать нулевые значения и
get()возвращение null однозначно означает, что ключ отсутствует. Реализации, которые поддерживают нулевые значения, должны переопределить эту реализацию по умолчанию. - Параметры:
-
key- ключ, с которым должно быть связано указанное значение -
remappingFunction- функция переопределения для вычисления значения - Возвращает:
- новое значение, связанное с указанным ключом, или null, если нет
- Исключения:
-
UnsupportedOperationException- если операцияputне поддерживается этой картой (необязательно) -
ClassCastException- если класс указанного ключа или значения не позволяет его хранение в этой карте (необязательно) -
NullPointerException- если указанный ключ равен 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 не может содержать нулевые значения и
get()возвращение null однозначно означает, что ключ отсутствует. Реализации, которые поддерживают нулевые значения, должны переопределить эту реализацию по умолчанию. - Параметры:
-
key- ключ, с которым должно быть связано результирующее значение -
value- ненулевое значение, которое должно быть объединено с существующим значением, связанным с ключом, или, если нет существующего значения или значение равно null, которое должно быть связано с ключом -
remappingFunction- функция переопределения для повторного вычисления значения, если оно присутствует - Возвращает:
- новое значение, связанное с указанным ключом, или null, если значение не связано с ключом
- Исключения:
-
UnsupportedOperationException- если операцияputне поддерживается этой картой (необязательно) -
ClassCastException- если класс указанного ключа или значения не позволяет его хранение в этой карте (необязательно) -
NullPointerException- если указанный ключ равен null, и эта карта не поддерживает нулевые ключи, или значение или remappingFunction равен null -
IllegalArgumentException- если некоторые свойства указанного ключа или значения не позволяют его хранение в этой карте (необязательно) - С:
- 1.8
© 1993, 2023, 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/21/docs/api/java.base/java/util/concurrent/ConcurrentMap.html