Ответ
При переопределении 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 и других хэш-коллекциях для эффективного поиска. Если не переопределить, равные объекты могут попасть в разные "корзины", что нарушит логику работы коллекций.