Равенство
В Kotlin есть два типа равенства:
- Равенство структур (
==- проверка черезequals()) - Равенство ссылок (
===- две ссылки указывают на один и тот же объект)
Равенство структур
Структурное равенство проверяется оператором == и его отрицанием !=. По соглашению выражение a == b
транслируется в:
a?.equals(b) ?: (b === null)
Если a не null, вызывается функция equals(Any?), иначе (т.е. если a указывает на null) b ссылочно
сравнивается с null.
Заметьте, что в явном сравнении с null для оптимизации нет смысла: a == null будет автоматически транслироваться в
a === null.
Чтобы обеспечить вашу реализацию проверки равенства, переопределите функцию
equals(other: Any?): Boolean. Функции с тем же
именем и другими сигнатурами, например equals(other: Foo), не влияют на проверку равенства с помощью операторов == и
!=.
Структурное равенство не имеет ничего общего со сравнением, определяемым интерфейсом Comparable<...>, поэтому только
пользовательская реализация equals(Any?) может повлиять на поведение оператора.
Равенство ссылок
Равенство ссылок проверяется с помощью оператора === и его отрицания !==. Выражение a === b является истиной тогда
и только тогда, когда a и b указывают на один и тот же объект. Для значений, представленных примитивными типами во
время выполнения (например, Int), проверка равенства === эквивалентна проверке ==.
Равенство чисел с плавающей точкой
Когда статически известно, что операнды проверки равенства являются Float или Double (nullable или нет), проверка
выполняется в соответствии со стандартом IEEE 754 для арифметики с плавающей запятой.
В противном случае используется структурное равенство, которое противоречит стандарту, так что NaN равно самому себе,
а -0.0 не равно 0.0.