middle
Как устроен HashMap
HashMap — это хэш-таблица, состоящая из массива «корзин» (buckets). Каждая корзина хранит ссылку на связный список (или красно-черное дерево с Java 8) объектов Node<K,V>.
Алгоритм добавления элемента (put):
- Вычисляется
hashCode()ключа. - Хэш дополнительно перемешивается:
hash = hashCode ^ (hashCode >>> 16)(для лучшего распределения). - Определяется индекс корзины:
index = hash & (capacity - 1). - Если корзина пуста — создается новый Node.
- Если корзина занята — обходится список/дерево в корзине, сравнивая ключи через
equals(). Если ключ найден — значение заменяется. Если не найден — элемент добавляется в конец. - Если количество элементов в корзине достигает порога
TREEIFY_THRESHOLD(8) — список преобразуется в красно-черное дерево (при условии, что общая capacity >= 64).
Алгоритм поиска (get): аналогичен шагам 1-3, затем поиск в списке/дереве корзины через equals().
На собеседовании: объясните полный цикл put: hashCode -> перемешивание -> индекс корзины -> обход списка -> treeification. Упомяните TREEIFY_THRESHOLD = 8.