Что произойдёт, если использовать объект (не String) в качестве ключа в HashMap?

«Что произойдёт, если использовать объект (не String) в качестве ключа в HashMap?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Использование объекта в качестве ключа допустимо, но корректность работы HashMap или HashSet зависит от правильной реализации методов equals() и hashCode().

Поведение в зависимости от реализации:

Реализация методов Результат сравнения ключей Пример map.get(new Key("id"))
Без переопределения (используются методы Object) По ссылке (reference equality) null (новый объект ≠ ключу в мапе)
С корректным переопределением По содержимому (value equality) Найдёт значение (объекты равны по полям)

Пример корректного класса-ключа:

class Person {
    private String name;
    Person(String name) { this.name = name; }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Person)) return false;
        return this.name.equals(((Person) o).name);
    }

    @Override
    public int hashCode() {
        return name.hashCode(); // Согласованность с equals()
    }
}

Map<Person, String> map = new HashMap<>();
map.put(new Person("Alice"), "Engineer");
System.out.println(map.get(new Person("Alice"))); // Выведет: "Engineer"

Важно: Контракт между equals() и hashCode() требует, чтобы равные объекты возвращали одинаковый хэш-код.