Описание тега hashmap

Структура данных, которая использует хэш-функцию для сопоставления идентифицирующих значений, известных как ключи, с соответствующими им значениями.

Хеш-карта (или хеш-таблица) - это структура данных, которая содержит пары "ключ-значение" и позволяет получать значения по ключу.

Самая привлекательная функция - быстрый поиск элементов, особенно для большого количества элементов. Хеш-карты работают с использованием хеш-функции для преобразования ключей в хеш-число, которое затем используется в качестве индекса для массива "сегментов", содержащего один или несколько элементов. Это обеспечивает постоянный доступ по времени к соответствующему сегменту с последующим линейным поиском нужного элемента внутри сегмента. Когда количество элементов в каждом сегменте остается низким (возможно, путем динамического изменения размера массива сегментов по мере вставки элементов), это обеспечивает постоянный поиск по времени в среднем, даже когда количество элементов в хеш-карте увеличивается. Это может быть значительным преимуществом по сравнению с поиском в древовидной структуре, который требует выполнения большего количества шагов по мере увеличения количества элементов.

Недостатком хеш-таблиц является то, что элементы не хранятся в очевидном или значимом порядке, поскольку хорошая хеш-функция не будет отображать соседние ключи в соседние сегменты.

Если много сопоставлений должно храниться в HashMap Например, создание его с достаточно большой емкостью позволит хранить сопоставления более эффективно, чем выполнение автоматического повторного хеширования по мере необходимости для увеличения таблицы.

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

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

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

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

Этот класс является членом Java Collections Framework.

Официальные документы: https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html

Ссылка на Stackru: различия между HashMap и Hashtable?