Класс HashMap<K,​V>

Type Parameters:
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, этот класс может использовать порядок сравнения ключей для устранения совпадений.

Обратите внимание, что эта реализация не синхронизирована. Если несколько потоков одновременно обращаются к хеш-карте и хотя бы один из потоков изменяет карту структурно, ее необходимо синхронизировать внешне. (Структурное изменение — это любая операция, которая добавляет или удаляет одно или несколько сопоставлений; простое изменение значения, связанного с ключом, который уже содержится в экземпляре, не является структурным изменением.) Это обычно делается путем синхронизации на каком-либо объекте, естественным образом encapsulating карту. Если такого объекта нет, карта должна быть «оборачена» с помощью метода Collections.synchronizedMap. Лучше всего это сделать на этапе создания, чтобы предотвратить случайный несинхронизированный доступ к карте:

Map m = Collections.synchronizedMap(new HashMap(...));

Итераторы, возвращаемые всеми методами «представления коллекций» этого класса, являются быстропроверяемыми: если карта структурно изменяется в любое время после создания итератора, каким-либо способом, кроме метода самого итератора remove, итератор выбросит исключение ConcurrentModificationException. Таким образом, при одновременном изменении итератор быстро и чисто завершает работу, а не рискует произвольным непредсказуемым поведением в неопределенное время в будущем.

Обратите внимание, что гарантии быстропроверяемого поведения итератора не предоставляются, поскольку, как правило, невозможно дать какие-либо гарантии в случае одновременного несинхронизированного изменения. Быстропроверяемые итераторы выбрасывают исключение ConcurrentModificationException с лучшим результатом. Поэтому было бы неправильно писать программу, зависящую от этого исключения для правильности: быстропроверяемое поведение итераторов должно использоваться только для обнаружения ошибок.

Этот класс является частью Java Collections Framework.

Since:
1.2
См. также:
Object.hashCode(), Collection, Map, TreeMap, Hashtable, Serialized Form

Вложенные классы

Вложенные классы/интерфейсы, объявленные в классе java.util.AbstractMap

AbstractMap.SimpleEntry<K,​V>, AbstractMap.SimpleImmutableEntry<K,​V>

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

Map.Entry<K,​V>

Конструкторы

Конструктор Описание
HashMap()

Создаёт пустую карту HashMap с по умолчанию начальной ёмкостью (16) и по умолчанию коэффициентом заполнения (0.75).

HashMap​(int initialCapacity)

Создаёт пустую карту HashMap с указанной начальной ёмкостью и по умолчанию коэффициентом заполнения (0.75).

HashMap​(int initialCapacity, float loadFactor)

Создаёт пустую карту HashMap с указанной начальной ёмкостью и коэффициентом заполнения.

HashMap​(Map<? extends K,​? extends V> m)

Создаёт новую карту HashMap с теми же сопоставлениями, что и в указанной карте Map.

Методы

Модификатор и тип Метод Описание
void clear()

Удаляет все сопоставления из этой карты.

Object clone()

Возвращает неглубокую копию этого экземпляра HashMap: ключи и значения сами не клонируются.

V compute​(K key, BiFunction<? super K,​? super V,​? extends V> remappingFunction)

Попытка вычислить сопоставление для указанного ключа и его текущего сопоставленного значения (или null, если текущего сопоставления нет).

V computeIfAbsent​(K key, Function<? super K,​? extends V> mappingFunction)

Если указанный ключ не связан со значением (или связан с null), пытается вычислить его значение с помощью заданной функции сопоставления и ввести его в эту карту, если это не приведет к null.

V computeIfPresent​(K key, BiFunction<? super K,​? super V,​? extends V> remappingFunction)

Если значение для указанного ключа присутствует и не равно null, пытается вычислить новое сопоставление, используя ключ и его текущее сопоставленное значение.

boolean containsKey​(Object key)

Возвращает true, если эта карта содержит сопоставление для указанного ключа.

boolean containsValue​(Object value)

Возвращает true, если эта карта сопоставляет один или несколько ключей со значением.

Set<Map.Entry<K,​V>> entrySet()

Возвращает представление Set сопоставлений, содержащихся в этой карте.

V get​(Object key)

Возвращает значение, которому сопоставлен указанный ключ, или null, если эта карта не содержит сопоставления для ключа.

boolean isEmpty()

Возвращает true, если эта карта не содержит пар ключ-значение.

Set<K> keySet()

Возвращает представление Set ключей, содержащихся в этой карте.

V merge​(K key, V value, BiFunction<? super V,​? super V,​? extends V> remappingFunction)

Если указанный ключ не связан со значением или связан с null, связывает его с заданным ненулевым значением.

V put​(K key, V value)

Связывает указанное значение с указанным ключом в этой карте.

void putAll​(Map<? extends K,​? extends V> m)

Копирует все сопоставления из указанной карты в эту карту.

V remove​(Object key)

Удаляет сопоставление для указанного ключа из этой карты, если оно присутствует.

int size()

Возвращает количество пар ключ-значение в этой карте.

Collection<V> values()

Возвращает представление Collection значений, содержащихся в этой карте.

Методы, объявленные в классе java.util.AbstractMap

equals, hashCode, toString

Методы, объявленные в классе java.lang.Object

finalize, getClass, notify, notifyAll, wait, wait, wait

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

equals, forEach, getOrDefault, hashCode, putIfAbsent, remove, replace, replace, replaceAll

Конструкторы

HashMap

public HashMap(int initialCapacity,
               float loadFactor)

Создаёт пустой HashMap с указанной начальной ёмкостью и коэффициентом заполнения.

Параметры:
initialCapacity - начальная ёмкость
loadFactor - коэффициент заполнения
Исключения:
IllegalArgumentException - если начальная ёмкость отрицательная или коэффициент заполнения не положительный

HashMap

public HashMap(int initialCapacity)

Создаёт пустой HashMap с указанной начальной ёмкостью и значением коэффициента заполнения по умолчанию (0,75).

Параметры:
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

public int size()

Возвращает количество пар ключ-значение в этой карте.

Указано в:
size в интерфейсе Map<K,​V>
Переопределяет:
size в классе AbstractMap<K,​V>
Возвращает:
количество пар ключ-значение в этой карте

isEmpty

public boolean isEmpty()

Возвращает true, если эта карта не содержит пар ключ-значение.

Указано в:
isEmpty в интерфейсе Map<K,​V>
Переопределяет:
isEmpty в классе AbstractMap<K,​V>
Возвращает:
true, если эта карта не содержит пар ключ-значение

get

public V get(Object key)

Возвращает значение, которому сопоставлен указанный ключ, или null, если эта карта не содержит сопоставления для ключа.

Более формально, если эта карта содержит сопоставление из ключа k к значению v, такое что (key==null ? k==null : key.equals(k)), то этот метод возвращает v; в противном случае он возвращает null. (Может быть не более одного такого сопоставления.)

Возвращаемое значение null не обязательно указывает, что карта не содержит сопоставления для ключа; также возможно, что карта явно сопоставляет ключ со значением null. Для различения этих двух случаев можно использовать операцию containsKey.

Указано в:
get в интерфейсе Map<K,​V>
Переопределяет:
get в классе AbstractMap<K,​V>
Параметры:
key - ключ, связанное значение которого должно быть возвращено
Возвращает:
значение, которому сопоставлен указанный ключ, или null, если эта карта не содержит сопоставления для ключа
См. также:
put(Object, Object)

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

public void clear()

Удаляет все сопоставления из этой карты. Карта будет пустой после возврата этого вызова.

Указано в:
clear в интерфейсе Map<K,​V>
Переопределяет:
clear в классе AbstractMap<K,​V>

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.

Указано в:
keySet в интерфейсе Map<K,​V>
Переопределяет:
keySet в классе AbstractMap<K,​V>
Возвращает:
представление множества ключей, содержащихся в этой карте

values

public Collection<V> values()

Возвращает представление Collection значений, содержащихся в этой карте. Коллекция основана на карте, поэтому изменения в карте отражаются в коллекции, и наоборот. Если карта изменяется во время итерации по коллекции (кроме операций самого итератора remove ), результаты итерации не определены. Коллекция поддерживает удаление элементов, что удаляет соответствующее сопоставление из карты, посредством операций Iterator.remove, Collection.remove, removeAll, retainAll и clear. Она не поддерживает операции add или addAll.

Указано в:
values в интерфейсе Map<K,​V>
Переопределяет:
values в классе AbstractMap<K,​V>
Возвращает:
представление значений, содержащихся в этой карте

entrySet

public Set<Map.Entry<K,V>> entrySet()

Возвращает представление Set сопоставлений, содержащихся в этой карте. Множество основано на карте, поэтому изменения в карте отражаются в множестве, и наоборот. Если карта изменяется во время итерации по множеству (кроме операций самого итератора remove или через операцию setValue на элементе карты, возвращённом итератором), результаты итерации не определены. Множество поддерживает удаление элементов, что удаляет соответствующее сопоставление из карты, посредством операций Iterator.remove, Set.remove, removeAll, retainAll и clear. Оно не поддерживает операции add или addAll.

Указано в:
entrySet в интерфейсе Map<K,​V>
Возвращает:
представление множества сопоставлений, содержащихся в этой карте

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

Если функция переопределения возвращает 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 сообщение к сопоставленному значению:

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, связывает его с заданным ненулевым значением. В противном случае, заменяет связанное значение результатами заданной функции переопределения или удаляет, если результат 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>
Возвращает:
поверхностную копию этой карты
См. также:
Cloneable

© 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/HashMap.html

Spec-Zone .ru
спецификации, руководства, описания, API