Что такое контракт между equals и hashCode

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

Ответ

Контракт между equals и hashCode в Java (и Kotlin) требует, что если два объекта равны по equals, то их hashCode должен быть одинаковым. Обратное не обязательно: разные объекты могут иметь одинаковый hashCode.

Нарушение контракта может привести к ошибкам в коллекциях, например, в HashMap или HashSet.

Пример на Kotlin:

data class Person(val name: String, val age: Int) {
    override fun hashCode(): Int {
        return name.hashCode() + age
    }
}

Здесь data class автоматически генерирует корректные equals/hashCode. Если переопределять вручную, нужно соблюдать контракт:

  • Если a == b, то a.hashCode() == b.hashCode()
  • hashCode() должен возвращать одинаковое значение для неизменяемого объекта