Ответ
Для корректной работы в качестве ключа в HashMap класс должен переопределить методы equals() и hashCode().
Правила:
hashCode()должен возвращать одинаковое значение для одинаковых объектов (еслиa.equals(b) == true, тоa.hashCode() == b.hashCode()).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, иначе элемент может потеряться.