Что переопределить у класса для его хранения в HashMap в качестве ключа

«Что переопределить у класса для его хранения в HashMap в качестве ключа» — вопрос из категории Java, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для корректной работы в качестве ключа в HashMap класс должен переопределить методы equals() и hashCode().

Правила:

  1. hashCode() должен возвращать одинаковое значение для одинаковых объектов (если a.equals(b) == true, то a.hashCode() == b.hashCode()).
  2. equals() должен быть рефлексивным, симметричным, транзитивным и согласованным.

Пример:

data class Person(val id: Int, val name: String) {
    override fun equals(other: Any?): Boolean {
        if (this === other) return true
        if (other !is Person) return false
        return id == other.id
    }

    override fun hashCode(): Int = id
}

Важно: Если ключ изменяемый, его поля, участвующие в equals/hashCode, не должны меняться после добавления в HashMap, иначе элемент может потеряться.