middle
Как работает HashMap при попытке сохранить два элемента с одинаковым hashCode(), но разными equals()
Оба элемента будут сохранены в одной корзине. Это ситуация называется коллизией хэш-функции.
Алгоритм:
- Первый элемент добавляется в корзину, определенную по hashCode().
- При добавлении второго элемента вычисляется тот же индекс корзины (hashCode одинаков).
- HashMap обходит список в корзине и вызывает
equals()для каждого ключа. - Поскольку
equals()возвращает false, ключи считаются разными. - Второй элемент добавляется в конец связного списка (или в дерево, если список преобразован).
При последующем поиске через get() HashMap найдет нужную корзину по hashCode, а затем в цепочке найдет конкретный элемент по equals(). Если коллизий много, поиск в цепочке деградирует до O(N) для списка или O(log N) для дерева.
На собеседовании: объясните, что оба элемента попадут в одну корзину и будут различены через equals(). Это классический вопрос на понимание связи hashCode() и equals().