Влияние изменения полей объекта‑ключа на работу HashMap

В данном коде останется одна запись со значением Two: Key не переопределяет equals/hashCode, поэтому использует идентичность объекта. Изменение id здесь не меняет его hashCode.

Короткий ответ

Что ответить на собеседовании

В данном коде останется одна запись со значением Two: Key не переопределяет equals/hashCode, поэтому использует идентичность объекта. Изменение id здесь не меняет его hashCode.

Подробный разбор

Ответ с пояснениями

Условие

В примере создаётся объект класса Key, который выступает в роли ключа для HashMap. После того как объект помещён в карту, его поле id изменяется, а затем тот же объект используется для вставки нового значения. Какое состояние карты будет в итоге: один ключ с новым значением или два отдельных ключа? Объясните, как HashMap обрабатывает такие изменения.

import java.util.HashMap;
import java.util.Map;

public class JetbulbInterview {
    public static void main(String[] args) {
        Map<Key, String> map = new HashMap<>();

        Key key = new Key(1, "1");
        map.put(key, "One");

        key.id = 22;
        map.put(key, "Two");

        System.out.println(map);
    }
}

class Key {
    int id;
    String name;

    public Key(int id, String name) {
        this.id = id;
        this.name = name;
    }
}

Ответ

В данном коде останется одна запись со значением Two: Key не переопределяет equals/hashCode, поэтому использует идентичность объекта. Изменение id здесь не меняет его hashCode.

Второй put получает ту же ссылку и заменяет прежнее значение. Вывод ключа будет стандартным Key@..., потому что toString тоже не переопределён. Если бы equals/hashCode зависели от id, изменение поля после вставки нарушило бы контракт ключа и могло оставить недоступную старую запись. Но к показанному классу этот распространённый сценарий не относится.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее