HashMap в Java основан на принципах хеширования. Он хранит пары "ключ-значение".
Внутреннее устройство:
put):
key.hashCode()).hash).хеш & (размер_массива - 1)).Node) помещается в этот бакет. Если бакет уже содержит элементы, новый элемент добавляется в начало связного списка или дерева.equals() для сравнения ключей внутри бакета. Если ключ найден, значение обновляется.get):
hashCode() и equals().Организация:
load factor * capacity), HashMap увеличивает размер внутреннего массива бакетов (обычно вдвое) и перехеширует все элементы. Это дорогая операция (O(n)).capacity: Начальный размер массива бакетов (по умолчанию 16).load factor: Порог загрузки (по умолчанию 0.75). Определяет, когда произойдет ресайзинг.Почему важны hashCode() и equals():
equals() возвращает true для двух объектов, то и hashCode() должен возвращать одинаковое значение.get вернет null), даже если они были добавлены.Пример структуры Node:
java
HashMap обеспечивает быстрое (в среднем O(1)) добавление, получение и удаление элементов при равномерном распределении хешей. В худшем случае (сильные коллизии) операция может стать O(n) или O(log n) с деревьями.
Не потокобезопасен. Для потокобезопасного использования следует использовать ConcurrentHashMap или Collections.synchronizedMap(new HashMap<...>(...)).