Равенство
В 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?) может повлиять на поведение оператора.
Равенство чисел с плавающей точкой
Когда операнды проверки на равенство статически известны как Float или Double (nullable или нет), проверка соответствует стандарту IEEE 754 для арифметики с плавающей точкой.
В противном случае используется структурное равенство, которое не соответствует стандарту, так что NaN равно самому себе, и -0.0 не равно 0.0.
См.: Сравнение чисел с плавающей точкой.
Ссылочное равенство
Ссылочное равенство проверяется операцией === (и её отрицанием !==). a === b истинно тогда и только тогда, когда a и b указывают на один и тот же объект. Для значений, которые на этапе выполнения представлены как примитивные типы (например, Int), проверка на === равенство эквивалентна проверке ==.
© 2010–2020 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/reference/equality.html