Класс 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.
- Since:
- 1.2
- См. также:
Краткое описание вложенных классов
Вложенные классы/интерфейсы, объявленные в классе java.util.AbstractMap
AbstractMap.SimpleEntry<K, V>, AbstractMap.SimpleImmutableEntry<K, V>
Краткое описание конструкторов
| Конструктор | Описание |
|---|---|
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 |
Если значение для указанного ключа присутствует и не null, пытается вычислить новое отображение, учитывая ключ и его текущее сопоставленное значение. |
boolean |
containsKey |
Возвращает true , если в этом отображении есть отображение для указанного ключа. |
boolean |
containsValue |
Возвращает true , если это отображение сопоставляет один или несколько ключей со значением. |
Set<Map.Entry<K, |
entrySet() |
Возвращает Set представление отображений, содержащихся в этом отображении. |
V |
get |
Возвращает значение, которому сопоставлен указанный ключ, или null , если в этом отображении нет отображения для ключа. |
boolean |
isEmpty() |
Возвращает true , если в этом отображении нет пар ключ-значение. |
Set<K> |
keySet() |
Возвращает Set представление ключей, содержащихся в этом отображении. |
V |
merge |
Если указанный ключ ещё не связан со значением или связан с null, связывает его с заданным ненулевым значением. |
V |
put |
Связывает указанное значение с указанным ключом в этом отображении. |
void |
putAll |
Копирует все отображения из указанного отображения в это отображение. |
V |
remove |
Удаляет отображение для указанного ключа из этого отображения, если оно присутствует. |
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если в этой карте нет отображения для ключа - См. также:
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()
remove, Set.remove, removeAll, retainAll, и clear. Он не поддерживает операции add или addAll. - Определено в:
-
keySetв интерфейсеMap<K,V> - Переопределяет:
-
keySetв классеAbstractMap<K,V> - Возвращает:
- представление в виде набора ключей, содержащихся в этой карте
values
public Collection<V> values()
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 сопоставлений, содержащихся в этом отображении. Множество поддерживается отображением, поэтому изменения в отображении отражаются в множестве и наоборот. Если отображение изменяется во время итерации по множеству (кроме операций самого итератора или операции setValue на элементе отображения, возвращённом итератором), результаты итерации не определены. Множество поддерживает удаление элементов, которое удаляет соответствующее сопоставление из отображения, с помощью операций Iterator.remove, Set.remove, removeAll, retainAll и clear. Оно не поддерживает операции add или addAll. - Specified by:
-
entrySetв интерфейсеMap<K,V> - Returns:
- представление множества сопоставлений, содержащихся в этом отображении
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, если будет обнаружено, что функция отображения изменяет это отображение во время вычисления.
- Specified by:
-
computeIfAbsentв интерфейсеMap<K,V> - Parameters:
-
key- ключ, с которым должно быть связано указанное значение -
mappingFunction- функция отображения для вычисления значения - Returns:
- текущее (существующее или вычисленное) значение, связанное с указанным ключом, или null, если вычисленное значение равно null
- Throws:
-
ConcurrentModificationException- если будет обнаружено, что функция отображения изменила это отображение
computeIfPresent
public V computeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction)
Если функция перепривязки возвращает null, сопоставление удаляется. Если сама функция перепривязки вызывает (непроверенное) исключение, исключение перебрасывается, и текущее сопоставление остается неизменным.
Функция перепривязки не должна изменять это отображение во время вычисления.
Этот метод будет по возможности выбрасывать ConcurrentModificationException, если будет обнаружено, что функция перепривязки изменяет это отображение во время вычисления.
- Specified by:
-
computeIfPresentв интерфейсеMap<K,V> - Parameters:
-
key- ключ, с которым должно быть связано указанное значение -
remappingFunction- функция перепривязки для вычисления значения - Returns:
- новое значение, связанное с указанным ключом, или null, если такого нет
- Throws:
-
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, если будет обнаружено, что функция перепривязки изменяет это отображение во время вычисления.
- Specified by:
-
computeв интерфейсеMap<K,V> - Parameters:
-
key- ключ, с которым должно быть связано указанное значение -
remappingFunction- функция перепривязки для вычисления значения - Returns:
- новое значение, связанное с указанным ключом, или null, если такого нет
- Throws:
-
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, если будет обнаружено, что функция перепривязки изменяет это отображение во время вычисления.
- Specified by:
-
mergeв интерфейсеMap<K,V> - Parameters:
-
key- ключ, с которым должно быть связано результирующее значение -
value- ненулевое значение, которое должно быть объединено с существующим значением, связанным с ключом, или, если нет существующего значения или связанного нулевого значения, которое должно быть связано с ключом -
remappingFunction- функция перепривязки для повторного вычисления значения, если оно присутствует - Returns:
- новое значение, связанное с указанным ключом, или null, если значение не связано с ключом
- Throws:
-
HashMap- если будет обнаружено, что функция перепривязки изменила это отображение
clone
public Object clone()
HashMap экземпляра: ключи и значения сами не клонируются.- Overrides:
-
cloneв классеAbstractMap<K,V> - Returns:
- неглубокая копия этого отображения
- See Also:
© 1993, 2021, 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/17/docs/api/java.base/java/util/HashMap.html