Middle
149
questionbank
Как работает HashMap?
Ответ от нейросети
sobes.tech AI
HashMap хранит данные в виде пар ключ-значение.
Внутренне использует массив Node (или entry).
При добавлении пары:
- Вычисляется хэш-код ключа методом
hashCode(). - По хэш-коду определяется индекс в массиве (бакет).
- Если в бакете уже есть элементы, проверяется уникальность ключа по методу
equals(). - Если ключ уникален, пара добавляется в бакет. При коллизиях (разные ключи имеют одинаковый хэш) используется связный список или сбалансированное дерево (красно-черное) для хранения элементов в одном бакете.
// Пример узла HashMap
class Node<K,V> implements Map.Entry<K,V> {
final int hash; // хэш ключа
final K key; // ключ
V value; // значение
Node<K,V> next; // ссылка на следующий элемент в бакете при коллизии
Node(int hash, K key, V value, Node<K,V> next) {
this.hash = hash;
this.key = key;
this.value = value;
this.next = next;
}
// ... другие методы как getKey(), getValue(), setValue()
}
При получении значения по ключу:
- Вычисляется хэш-код ключа.
- Определяется индекс в массиве.
- В соответствующем бакете происходит поиск по ключу с использованием
equals().
Важные моментыConcurrency: HashMap не потокобезопасен.
null: Позволяет хранить один null-ключ и множество null-значений.
Производительность: В среднем операции put и get работают за O(1), но при сильных коллизиях могут деградировать до O(n) при использовании связного списка.
Заполнение (Load Factor): При достижении определенного процента заполнения массив пересоздается с увеличенным размером (рехеширование), что может быть ресурсоемким.
| Метод | Сложность (средняя) | Сложность (худшая) |
|---|---|---|
| put(key, value) | O(1) | O(n) |
| get(key) | O(1) | O(n) |
| containsKey(key) | O(1) | O(n) |