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

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

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

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

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

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

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

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

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

Этот класс является членом коллекций Java Фреймворк.

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

Stackoverflow Link: https: //docs.oracle.com/javase/8/docs/api/java/util/HashMap.html