Для чего нужно переопределять equals и hashCode

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

Ответ

Переопределение equals и hashCode необходимо для корректной работы объектов в коллекциях, таких как HashSet, HashMap и других, основанных на хешировании.

Правила:

  1. Если equals возвращает true, то hashCode должен быть одинаковым.
  2. Если hashCode разный, equals должен вернуть false.

Пример:

data 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).