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

Какие типы объектов рекомендуется использовать в качестве ключа в HashMap, чтобы избежать их потери или неправильного поведения?

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

sobes.tech AI

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

Чаще всего в качестве ключей используют:

  • Строки (String), так как они неизменяемы.
  • Объекты-обертки над примитивами (Integer, Long, UUID и т.п.), которые тоже неизменяемы.
  • Кастомные классы с переопределёнными hashCode() и equals(), при этом все поля, участвующие в вычислении хэш-кода, должны быть неизменяемыми.

Пример:

public final class PersonKey {
    private final String passportNumber;

    public PersonKey(String passportNumber) {
        this.passportNumber = passportNumber;
    }

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

    @Override
    public int hashCode() {
        return passportNumber.hashCode();
    }
}

Таким образом, ключи должны быть неизменяемыми и корректно реализовывать hashCode() и equals().