Sobes.tech
Назад к вопросам
Junior — Middle
52

Как изменение ключа влияет на структуру и поведение HashMap в Java?

Компании, где спрашивали
СБЕРСБЕР

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

sobes.tech AI

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

Почему?

  • При добавлении элемента ключ хэшируется, и элемент помещается в определённый бакет.
  • При поиске элемента по ключу HashMap вычисляет хэш и ищет в соответствующем бакете.

Если ключ изменился после добавления, то при поиске по новому состоянию ключа будет вычислен другой хэш, и элемент не найдётся — он "потеряется" в карте.

Поэтому ключи в HashMap должны быть неизменяемыми (immutable) или не изменяться, пока они используются в качестве ключей.

Пример проблемы:

class Key {
    int id;
    Key(int id) { this.id = id; }
    public int hashCode() { return id; }
    public boolean equals(Object o) { return o instanceof Key && ((Key)o).id == id; }
}

Key key = new Key(1);
HashMap<Key, String> map = new HashMap<>();
map.put(key, "value");

key.id = 2; // изменили ключ

System.out.println(map.get(key)); // null, т.к. ключ "потерялся"