Sobes.tech
Назад к вопросам
Middle
120
questionbank

Когда происходит коллизия hashCode в HashMap?

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Коллизия в HashMap происходит тогда, когда у разных ключей получается один и тот же hashCode или один и тот же индекс корзины после вычисления позиции в таблице. Это нормальная ситуация для хеш-таблиц, и HashMap умеет с ней работать. Важно понимать, что одинаковый hashCode не означает равные объекты.

Определение:

Коллизия hashCode — это ситуация, когда два разных ключа отображаются в одну и ту же ячейку хеш-таблицы. В HashMap сначала вычисляется hashCode, затем на его основе определяется индекс в массиве бакетов. Если несколько ключей попадают в один бакет, возникает коллизия, и элементы хранятся в одной корзине с последующим сравнением по equals().

Пример использования:

Например, у двух разных объектов может совпасть hashCode, и тогда они попадут в один бакет HashMap, но останутся разными ключами, если equals() возвращает false.

import java.util.HashMap;
import java.util.Objects;

class Key {
    private final int id;

    Key(int id) {
        this.id = id;
    }

    @Override
    public int hashCode() {
        return 42; // искусственно создаём коллизию
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (!(obj instanceof Key)) return false;
        Key other = (Key) obj;
        return id == other.id;
    }
}

public class Demo {
    public static void main(String[] args) {
        HashMap<Key, String> map = new HashMap<>();
        map.put(new Key(1), "one");
        map.put(new Key(2), "two");

        System.out.println(map.size()); // 2
    }
}

Пояснение кода:

Код показывает, как два разных объекта Key с одинаковым hashCode попадают в один и тот же бакет.
HashMap сначала сравнивает hashCode, а при совпадении использует equals(), чтобы отличить ключи.
Поэтому, несмотря на коллизию, оба значения успешно сохраняются, потому что id у объектов разный.

Ключевые моменты:

  • Коллизия — это не ошибка, а нормальный механизм работы HashMap.
  • Совпадение hashCode не гарантирует равенство объектов.
  • Для различения ключей HashMap использует equals() после сравнения хеша.
  • При большом числе коллизий производительность операций может ухудшаться.
  • Хорошая реализация hashCode() должна равномерно распределять ключи по бакетам.
  • Для корректной работы ключей важно соблюдать контракт equals() и hashCode().