Класс HashMap<K, V>
- Параметры типа:
K— тип ключей, поддерживаемых этой картойV— тип отображаемых значений
- Все реализуемые интерфейсы:
Serializable, Cloneable, Map<K,V>
- Прямые известные подклассы:
LinkedHashMap, PrinterStateReasons
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
Map на основе хеш-таблицы. Эта реализация предоставляет все необязательные операции с отображениями и допускает значения null и ключ null. (Класс HashMap примерно эквивалентен Hashtable, за исключением того, что он не синхронизирован и допускает null.) Этот класс не дает никаких гарантий относительно порядка элементов отображения; в частности, он не гарантирует, что порядок останется неизменным с течением времени. Эта реализация обеспечивает постоянное время выполнения основных операций (get и put) при условии, что хеш-функция правильно распределяет элементы по корзинам. Итерация по представлениям коллекций требует времени, пропорционального «емкости» экземпляра HashMap (количеству корзин) плюс его размеру (количеству пар ключ-значение). Поэтому, если важна производительность итерации, крайне важно не задавать слишком большую начальную емкость (или слишком низкий коэффициент загрузки).
У экземпляра HashMap есть два параметра, влияющих на его производительность: начальная емкость и коэффициент загрузки. Емкость — это количество корзин в хеш-таблице, а начальная емкость — это просто емкость на момент создания хеш-таблицы. Коэффициент загрузки определяет, насколько заполненной может стать хеш-таблица, прежде чем ее емкость будет автоматически увеличена. Когда количество элементов в хеш-таблице превышает произведение коэффициента загрузки на текущую емкость, хеш-таблица подвергается перехешированию (то есть внутренние структуры данных перестраиваются), чтобы количество корзин в ней стало примерно вдвое больше.
Как правило, значение коэффициента загрузки по умолчанию (.75) обеспечивает хороший компромисс между затратами времени и памяти. Более высокие значения уменьшают накладные расходы по памяти, но увеличивают стоимость поиска (что отражается на большинстве операций класса HashMap, включая get и put). При задании начальной емкости следует учитывать ожидаемое количество элементов в отображении и коэффициент загрузки, чтобы свести к минимуму число операций перехеширования. Если начальная емкость превышает максимальное количество элементов, деленное на коэффициент загрузки, операции перехеширования не понадобятся.
Если в экземпляре HashMap предполагается хранить много отображений, создание его с достаточно большой емкостью позволит хранить отображения эффективнее, чем автоматическое перехеширование по мере необходимости для увеличения таблицы. Обратите внимание: использование множества ключей с одинаковым hashCode() гарантированно замедляет работу любой хеш-таблицы. Чтобы смягчить этот эффект, если ключи реализуют интерфейс Comparable, этот класс может использовать порядок сравнения ключей для разрешения конфликтов.
Обратите внимание, что эта реализация не синхронизирована. Если к хеш-отображению одновременно обращаются несколько потоков и хотя бы один из них структурно изменяет отображение, доступ должен синхронизироваться извне. (Структурным изменением считается любая операция, добавляющая или удаляющая одно или несколько отображений; простое изменение значения, связанного с ключом, который уже содержится в экземпляре, не является структурным изменением.) Обычно это достигается синхронизацией по объекту, который естественным образом инкапсулирует отображение. Если такого объекта нет, отображение следует «обернуть», используя метод Collections.synchronizedMap. Лучше всего сделать это при создании, чтобы предотвратить случайный несинхронизированный доступ к отображению:
Map m = Collections.synchronizedMap(new HashMap(...));
Итераторы, возвращаемые всеми «методами представлений коллекций» этого класса, являются быстро завершающимися: если после создания итератора отображение будет структурно изменено любым способом, кроме вызова собственного метода remove итератора, итератор выбросит исключение ConcurrentModificationException. Таким образом, при параллельном изменении итератор быстро и корректно завершает работу, не допуская произвольного недетерминированного поведения в неопределенный момент в будущем.
Обратите внимание, что гарантировать быстрое завершение итератора невозможно, поскольку, вообще говоря, при несинхронизированном параллельном изменении нельзя дать никаких строгих гарантий. Итераторы с быстрым завершением выбрасывают ConcurrentModificationException по возможности. Поэтому было бы ошибкой писать программу, корректность которой зависит от этого исключения: быстрое завершение итераторов следует использовать только для обнаружения ошибок.
Этот класс входит в состав Java Collections Framework.
- Начиная с версии:
- 1.2
- См. также:
Краткое описание вложенных классов
Вложенные классы/интерфейсы, объявленные в классе AbstractMap
AbstractMap.SimpleEntry<K, V>, AbstractMap.SimpleImmutableEntry<K, V> | Модификатор и тип | Класс | Описание |
|---|---|---|
static class |
AbstractMap.SimpleEntry<K, |
Запись, содержащая ключ и значение. |
static class |
AbstractMap.SimpleImmutableEntry<K, |
Неизменяемая запись, содержащая ключ и значение. |
Краткое описание конструкторов
| Конструктор | Описание |
|---|---|
HashMap() |
Создает пустой HashMap с начальной емкостью по умолчанию (16) и коэффициентом загрузки по умолчанию (0.75). |
HashMap |
Создает пустой HashMap с заданной начальной емкостью и коэффициентом загрузки по умолчанию (0.75). |
HashMap |
Создает пустой HashMap с заданными начальной емкостью и коэффициентом загрузки. |
HashMap |
Создает новый HashMap с теми же отображениями, что и указанный Map. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
void |
clear() |
Удаляет все отображения из этой карты. |
Object |
clone() |
Возвращает поверхностную копию этого экземпляра HashMap: сами ключи и значения не клонируются. |
V |
compute |
Пытается вычислить отображение для указанного ключа и его текущего отображаемого значения или null, если текущего отображения нет (необязательная операция). |
V |
computeIfAbsent |
Если указанный ключ еще не связан со значением (или отображается в null), пытается вычислить его значение с помощью заданной функции отображения и добавляет его в эту карту, если результат не равен null (необязательная операция). |
V |
computeIfPresent |
Если для указанного ключа существует ненулевое значение, пытается вычислить новое отображение на основе ключа и его текущего отображаемого значения (необязательная операция). |
boolean |
containsKey |
Возвращает true, если эта карта содержит отображение для указанного ключа. |
boolean |
containsValue |
Возвращает true, если эта карта отображает один или несколько ключей в указанное значение. |
Set |
entrySet() |
Возвращает представление Set отображений, содержащихся в этой карте. |
V |
get |
Возвращает значение, в которое отображается указанный ключ, или null, если эта карта не содержит отображения для ключа. |
boolean |
isEmpty() |
Возвращает true, если эта карта не содержит пар ключ-значение. |
Set |
keySet() |
Возвращает представление Set ключей, содержащихся в этой карте. |
V |
merge |
Если указанный ключ еще не связан со значением или связан со значением null, связывает его с заданным ненулевым значением (необязательная операция). |
static <K, |
newHashMap |
Создает новую пустую HashMap, подходящую для ожидаемого количества отображений. |
V |
put |
Связывает указанное значение с указанным ключом в этой карте. |
void |
putAll |
Копирует все отображения из указанной карты в эту карту. |
V |
remove |
Удаляет отображение для указанного ключа из этой карты, если оно существует. |
int |
size() |
Возвращает количество пар ключ-значение в этой карте. |
Collection |
values() |
Возвращает представление Collection значений, содержащихся в этой карте. |
Методы, объявленные в классе AbstractMap
equals, hashCode, toString | Модификатор и тип | Метод | Описание |
|---|---|---|
boolean |
equals |
Сравнивает указанный объект с этой картой на равенство. |
int |
hashCode() |
Возвращает значение хеш-кода этой карты. |
String |
toString() |
Возвращает строковое представление этой карты. |
Методы, объявленные в классе Object
finalize, getClass, notify, notifyAll, wait, wait, wait | Модификатор и тип | Метод | Описание |
|---|---|---|
protected void |
finalize() |
Устарело, будет удалено: этот элемент API может быть удален в будущей версии. Финализация устарела и будет удалена в одном из следующих выпусков. |
final Class |
getClass() |
Возвращает класс времени выполнения этого Object. |
final void |
notify() |
Пробуждает один поток, ожидающий на мониторе этого объекта. |
final void |
notifyAll() |
Пробуждает все потоки, ожидающие на мониторе этого объекта. |
final void |
wait() |
Заставляет текущий поток ожидать пробуждения, обычно вследствие уведомления или прерывания. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно вследствие уведомления или прерывания, либо до истечения заданного промежутка реального времени. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно вследствие уведомления или прерывания, либо до истечения заданного промежутка реального времени. |
Методы, объявленные в интерфейсе Map
forEach, getOrDefault, putIfAbsent, remove, replace, replace, replaceAll | Модификатор и тип | Метод | Описание |
|---|---|---|
default void |
forEach |
Выполняет указанное действие для каждой записи этой карты, пока не будут обработаны все записи или действие не выбросит исключение. |
default V |
getOrDefault |
Возвращает значение, в которое отображается указанный ключ, или defaultValue, если эта карта не содержит отображения для ключа. |
default V |
putIfAbsent |
Если указанный ключ еще не связан со значением (или отображается в null), связывает его с заданным значением и возвращает null; в противном случае возвращает текущее значение (необязательная операция). |
default boolean |
remove |
Удаляет запись для указанного ключа, только если в данный момент он отображается в указанное значение (необязательная операция). |
default V |
replace |
Заменяет запись для указанного ключа, только если в данный момент он отображается в какое-либо значение (необязательная операция). |
default boolean |
replace |
Заменяет запись для указанного ключа, только если в данный момент он отображается в указанное значение (необязательная операция). |
default void |
replaceAll |
Заменяет значение каждой записи результатом вызова заданной функции для этой записи, пока не будут обработаны все записи или функция не выбросит исключение (необязательная операция). |
Подробное описание конструкторов
HashMap
public HashMap(int initialCapacity, float loadFactor)
HashMap с заданной начальной емкостью и коэффициентом загрузки.- Примечание к API:
- Чтобы создать
HashMapс начальной емкостью, рассчитанной на ожидаемое количество отображений, используйтеnewHashMap. - Параметры:
-
initialCapacity— начальная емкость -
loadFactor— коэффициент загрузки - Исключения:
-
IllegalArgumentException— если начальная емкость отрицательна или коэффициент загрузки неположителен
HashMap
public HashMap(int initialCapacity)
HashMap с заданной начальной емкостью и коэффициентом загрузки по умолчанию (0.75).- Примечание к API:
- Чтобы создать
HashMapс начальной емкостью, рассчитанной на ожидаемое количество отображений, используйтеnewHashMap. - Параметры:
-
initialCapacity— начальная емкость. - Исключения:
-
IllegalArgumentException— если начальная емкость отрицательна.
HashMap
public HashMap()
HashMap с начальной емкостью по умолчанию (16) и коэффициентом загрузки по умолчанию (0.75).HashMap
public HashMap(Map<? extends K, ? extends V> m)
HashMap с теми же отображениями, что и указанная Map. HashMap создается с коэффициентом загрузки по умолчанию (0.75) и начальной емкостью, достаточной для хранения отображений указанной Map.- Параметры:
-
m— карта, отображения которой следует поместить в эту карту - Исключения:
-
NullPointerException— если указанная карта равна null
Подробное описание методов
size
isEmpty
get
public V get(Object key)
null, если в этой карте нет отображения для данного ключа. Формально, если эта карта содержит отображение от ключа k к значению v, такое что (key==null ? k==null :
key.equals(k)), этот метод возвращает v; в противном случае он возвращает null. (Такое отображение может быть не более чем одно.)
Возвращаемое значение null не обязательно означает, что в карте нет отображения для данного ключа; также возможно, что карта явно сопоставляет ключу значение null. Для различения этих двух случаев можно использовать операцию containsKey.
containsKey
public boolean containsKey(Object key)
true, если эта карта содержит отображение для указанного ключа.- Определено в:
-
containsKeyв интерфейсеMap<K,V> - Переопределяет:
-
containsKeyв классеAbstractMap<K,V> - Параметры:
-
key— ключ, наличие которого в этой карте необходимо проверить - Возвращает:
-
true, если эта карта содержит отображение для указанного ключа.
put
public V put(K key, V value)
- Определено в:
-
putв интерфейсеMap<K,V> - Переопределяет:
-
putв классеAbstractMap<K,V> - Параметры:
-
key— ключ, с которым связывается указанное значение -
value— значение, связываемое с указанным ключом - Возвращает:
- предыдущее значение, связанное с
key, илиnull, если дляkeyне было отображения. (Возвращаемое значениеnullтакже может означать, что ранее карта связывалаnullсkey.)
putAll
public void putAll(Map<? extends K, ? extends V> m)
- Определено в:
-
putAllв интерфейсеMap<K,V> - Переопределяет:
-
putAllв классеAbstractMap<K,V> - Параметры:
-
m— отображения, которые необходимо сохранить в этой карте - Исключения:
-
NullPointerException— если указанная карта равна null
remove
public V remove(Object key)
- Определено в:
-
removeв интерфейсеMap<K,V> - Переопределяет:
-
removeв классеAbstractMap<K,V> - Параметры:
-
key— ключ, отображение которого следует удалить из карты - Возвращает:
- предыдущее значение, связанное с
key, илиnull, если дляkeyне было отображения. (Возвращаемое значениеnullтакже может означать, что ранее карта связывалаnullсkey.)
clear
containsValue
public boolean containsValue(Object value)
true, если эта карта связывает один или несколько ключей с указанным значением.- Определено в:
-
containsValueв интерфейсеMap<K,V> - Переопределяет:
-
containsValueв классеAbstractMap<K,V> - Параметры:
-
value— значение, наличие которого в этой карте необходимо проверить - Возвращает:
-
true, если эта карта связывает один или несколько ключей с указанным значением
keySet
public Set<K> keySet()
Set. Множество поддерживается картой, поэтому изменения карты отражаются в множестве, и наоборот. Если карта изменяется во время итерации по множеству (кроме изменений с помощью собственной операции remove итератора), результаты итерации не определены. Множество поддерживает удаление элементов, которое удаляет соответствующее отображение из карты с помощью операций Iterator.remove, Set.remove, removeAll, retainAll и clear. Оно не поддерживает операции add и addAll.values
public Collection<V> values()
Collection. Коллекция поддерживается картой, поэтому изменения карты отражаются в коллекции, и наоборот. Если карта изменяется во время итерации по коллекции (кроме изменений с помощью собственной операции remove итератора), результаты итерации не определены. Коллекция поддерживает удаление элементов, которое удаляет соответствующее отображение из карты с помощью операций Iterator.remove, Collection.remove, removeAll, retainAll и clear. Она не поддерживает операции add и addAll.entrySet
public Set<Map.Entry<K,V>> entrySet()
Set. Множество поддерживается картой, поэтому изменения карты отражаются в множестве, и наоборот. Если карта изменяется во время итерации по множеству (кроме изменений с помощью собственной операции remove итератора или операции setValue над записью карты, возвращенной итератором), результаты итерации не определены. Множество поддерживает удаление элементов, которое удаляет соответствующее отображение из карты с помощью операций Iterator.remove, Set.remove, removeAll, retainAll и clear. Оно не поддерживает операции add и addAll.computeIfAbsent
public 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);
Функция отображения не должна изменять эту карту во время вычисления.
Этот метод по возможности выбрасывает ConcurrentModificationException, если обнаружено, что функция отображения изменяет эту карту во время вычисления.
- Определено в:
-
computeIfAbsentв интерфейсеMap<K,V> - Параметры:
-
key— ключ, с которым связывается указанное значение -
mappingFunction— функция отображения для вычисления значения - Возвращает:
- текущее (существующее или вычисленное) значение, связанное с указанным ключом, или null, если вычисленное значение равно null
- Исключения:
-
ConcurrentModificationException— если обнаружено, что функция отображения изменила эту карту
computeIfPresent
public V computeIfPresent(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)
Если функция переотображения возвращает null, отображение удаляется. Если сама функция переотображения выбрасывает (непроверяемое) исключение, оно повторно выбрасывается, а текущее отображение остается неизменным.
Функция переотображения не должна изменять эту карту во время вычисления.
Этот метод по возможности выбрасывает ConcurrentModificationException, если обнаружено, что функция переотображения изменяет эту карту во время вычисления.
- Определено в:
-
computeIfPresentв интерфейсеMap<K,V> - Параметры:
-
key— ключ, с которым связывается указанное значение -
remappingFunction— функция переотображения для вычисления значения - Возвращает:
- новое значение, связанное с указанным ключом, или null, если такого значения нет
- Исключения:
-
ConcurrentModificationException— если обнаружено, что функция переотображения изменила эту карту
compute
public 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, отображение удаляется (или остается отсутствующим, если изначально отсутствовало). Если сама функция переотображения выбрасывает (непроверяемое) исключение, оно повторно выбрасывается, а текущее отображение остается неизменным.
Функция переотображения не должна изменять эту карту во время вычисления.
Этот метод по возможности выбрасывает ConcurrentModificationException, если обнаружено, что функция переотображения изменяет эту карту во время вычисления.
- Определено в:
-
computeв интерфейсеMap<K,V> - Параметры:
-
key— ключ, с которым связывается указанное значение -
remappingFunction— функция переотображения для вычисления значения - Возвращает:
- новое значение, связанное с указанным ключом, или null, если такого значения нет
- Исключения:
-
ConcurrentModificationException— если обнаружено, что функция переотображения изменила эту карту
merge
public V merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction)
null. Этот метод может быть полезен при объединении нескольких отображаемых значений для одного ключа. Например, чтобы создать или добавить String msg к отображаемому значению: map.merge(key, msg, String::concat)
Если функция переотображения возвращает null, отображение удаляется. Если сама функция переотображения выбрасывает (непроверяемое) исключение, оно повторно выбрасывается, а текущее отображение остается неизменным.
Функция переотображения не должна изменять эту карту во время вычисления.
Этот метод по возможности выбрасывает ConcurrentModificationException, если обнаружено, что функция переотображения изменяет эту карту во время вычисления.
- Определено в:
-
mergeв интерфейсеMap<K,V> - Параметры:
-
key— ключ, с которым связывается результирующее значение -
value— ненулевое значение, объединяемое с существующим значением, связанным с ключом, или связываемое с ключом, если существующего значения нет либо с ключом связано значение null -
remappingFunction— функция переотображения для повторного вычисления значения, если оно имеется - Возвращает:
- новое значение, связанное с указанным ключом, или null, если с ключом не связано никакое значение
- Исключения:
-
ConcurrentModificationException— если обнаружено, что функция переотображения изменила эту карту
clone
public Object clone()
HashMap: сами ключи и значения не клонируются.- Переопределяет:
-
cloneв классеAbstractMap<K,V> - Возвращает:
- поверхностную копию этой карты
- См. также:
newHashMap
public static <K,V> HashMap<K,V> newHashMap(int numMappings)
- Параметры типа:
K— тип ключей, хранящихся в новой картеV— тип отображаемых значений- Параметры:
-
numMappings— ожидаемое количество отображений - Возвращает:
- созданную карту
- Исключения:
-
IllegalArgumentException— если numMappings отрицательно - Начиная с версии:
- 19
© 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.