Встречается на 2% собеседований по Java

Допустимо ли использовать класс User с изменяемыми полями в качестве ключа в HashMap

Использование изменяемого класса User в качестве ключа HashMap возможно, но крайне не рекомендуется. Проблема в том, что если изменить поле объекта после добавления в HashMap, изменится его хэш-код, что нарушит работу коллекции - объект может стать "потерянным" в мапе.

java
class User {
    String name;
    // геттеры/сеттеры
    
    @Override
    public int hashCode() {
        return name != null ? name.hashCode() : 0;
    }
}

User user = new User();
user.setName("Alice");
Map<User, String> map = new HashMap<>();
map.put(user, "value");

user.setName("Bob"); // хэш изменился
map.get(user); // вернет null - объект не найден

Лучшие практики:

  1. Делать ключи неизменяемыми (immutable)
  2. Если изменяемость необходима - не менять поля, участвующие в hashCode()/equals() после добавления в HashMap
  3. Альтернатива - использовать неизменяемый идентификатор (например, userId) в качестве ключа
Sophi
Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
Попробовать бесплатноArrow

Следующий вопрос

Это единственный вопрос по вашему фильтру

как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы