В каких случаях нужно переопределять hashCode

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

Ответ

При переопределении equals() необходимо также переопределять hashCode(), чтобы соблюдать контракт метода:

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

Пример с Person:

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

    override fun hashCode(): Int {
        return 31 * name.hashCode() + age
    }
}

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