Интерфейс ConcurrentMap<K,V>
- Параметры типа:
-
K- тип ключей, хранимых в этой карте -
V- тип сопоставленных значений
- Все суперинтерфейсы:
Map<K,V>
- Все известные подинтерфейсы:
ConcurrentNavigableMap<K,V>
- Все известные реализующие классы:
-
ConcurrentHashMap,ConcurrentSkipListMap
public interface ConcurrentMap<K,V> extends Map<K,V>
A Map обеспечивающая безопасность потоков и гарантии атомарности.
Для поддержания указанных гарантий, реализации методов по умолчанию, включая putIfAbsent(K, V), унаследованные от Map, должны быть переопределены реализациями этого интерфейса. Аналогично, реализации коллекций, возвращаемых методами Map.keySet(), Map.values() и Map.entrySet(), должны переопределять методы, такие как removeIf при необходимости для сохранения гарантий атомарности.
Влияние на согласованность памяти: Как и в других коллекциях потоков, действия в потоке перед размещением объекта в ConcurrentMap в качестве ключа или значения предшествуют последующим действиям доступа или удаления этого объекта из ConcurrentMap в другом потоке.
Этот интерфейс является членом Java Collections Framework.
- С:
- 1.5
Вложенные классы
Вложенные классы/интерфейсы, объявленные в интерфейсе java.util.Map
Map.Entry<K,V> Методы
| Модификатор и тип | Метод | Описание |
|---|---|---|
default V | compute(K key,
BiFunction<? super K,? super V,? extends V> remappingFunction) | Попытка вычислить отображение для указанного ключа и его текущего сопоставленного значения (или |
default V | computeIfAbsent(K key,
Function<? super K,? extends V> mappingFunction) | Если указанный ключ еще не связан со значением (или сопоставлен с |
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) | Возвращает значение, которому сопоставлен указанный ключ, или |
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) | Заменяет значение каждой записи результатом вызова заданной функции для этой записи, пока все записи не будут обработаны или функция не выбросит исключение. |
Методы, объявленные в интерфейсе java.util.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-ключей или 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-ключей или 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-ключей или 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-ключей или 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- если операцияsetне поддерживается итератором набора записей этой карты. -
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- если операцияputне поддерживается этой картой (необязательно) -
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- если операцияputне поддерживается этой картой (необязательно) -
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- если операцияputне поддерживается этой картой (необязательно) -
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- если операцияputне поддерживается этой картой (необязательно) -
ClassCastException- если класс указанного ключа или значения не позволяет его хранить в этой карте (необязательно) -
NullPointerException- если указанный ключ равен null, а эта карта не поддерживает null-ключи, или значение или remappingFunction равно null -
IllegalArgumentException- если некоторые свойства указанного ключа или значения препятствуют его хранению в этой карте (необязательно) - С:
- 1.8
© 1993, 2020, 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/11/docs/api/java.base/java/util/concurrent/ConcurrentMap.html