Ответ
В Kotlin data class автоматически генерирует equals(), который сравнивает все свойства, объявленные в первичном конструкторе.
data class User(val name: String, val age: Int)
val user1 = User("Alex", 25)
val user2 = User("Alex", 25)
println(user1 == user2) // true - свойства одинаковые
Ключевые особенности:
- Сравниваются только свойства из конструктора (не var/val в теле класса)
- Null-значения обрабатываются корректно
- Для массива используется
contentEquals(), а не== - Генерированный метод соответствует контракту
equals()(рефлексивность, симметричность и т.д.)
Для кастомного сравнения нужно переопределить equals() вручную.
Ответ 18+ 🔞
А, ну вот, классика, ебать мои старые костыли! Смотри, сейчас объясню про эти ваши data class в Kotlin, чтобы ты не пиздел потом, что не понял.
Вот представь, ты создал такую штуку:
data class User(val name: String, val age: Int)
val user1 = User("Alex", 25)
val user2 = User("Alex", 25)
println(user1 == user2) // true - свойства одинаковые
Видишь? Два разных объекта, но == вернёт true. Почему? Да потому что компилятор, хитрая жопа, сам для data class генерирует метод equals(), который тупо сравнивает ВСЕ свойства, которые ты объявил в первичном конструкторе. Не в теле класса, ёпта, а именно в конструкторе! Это важно, как отличить хуй от пальца.
Вот основные фишки, которые надо держать в голове, а то сам от себя охуеешь потом:
- Сравнивает только конструкторские свойства. Если у тебя внутри класса есть ещё какая-то
varилиval, но она не в скобочках конструктора — на неё всем похуй, в сравнении она участвовать не будет. Чисто конструктор. - С null'ами не сломается. Если какое-то свойство может быть
null, метод не вздрогнет, обработает нормально. - С массивами — засада! Вот тут внимание, ёклмн! Для массивов (
Array) используется не обычное сравнение==, аcontentEquals(). Если забудешь — будет тебе хиросима, а не сравнение. - Всё по науке. Сгенерированный метод не какой-то левый, он соблюдает все эти ваши умные контракты: рефлексивность, симметричность, транзитивность. Не косячит, короче.
А если тебе это автоматическое сравнение не подходит, если тебе надо как-то по-хитрому, по-особенному? Ну тогда, чувак, всё, приехали. Берёшь и переопределяешь equals() вручную, как большой. Пишешь свою логику, и волнение ебать — компилятор тебе уже не помощник. Сам за всё отвечаешь.