Gymterview
middle

Как работает HashMap при попытке сохранить два элемента с одинаковым hashCode(), но разными equals()

Оба элемента будут сохранены в одной корзине. Это ситуация называется коллизией хэш-функции.

Алгоритм:

  1. Первый элемент добавляется в корзину, определенную по hashCode().
  2. При добавлении второго элемента вычисляется тот же индекс корзины (hashCode одинаков).
  3. HashMap обходит список в корзине и вызывает equals() для каждого ключа.
  4. Поскольку equals() возвращает false, ключи считаются разными.
  5. Второй элемент добавляется в конец связного списка (или в дерево, если список преобразован).

При последующем поиске через get() HashMap найдет нужную корзину по hashCode, а затем в цепочке найдет конкретный элемент по equals(). Если коллизий много, поиск в цепочке деградирует до O(N) для списка или O(log N) для дерева.

На собеседовании: объясните, что оба элемента попадут в одну корзину и будут различены через equals(). Это классический вопрос на понимание связи hashCode() и equals().