Равенство
В 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 (необязательные или нет), проверка происходит в соответствии со стандартом IEEE 754 для арифметики с плавающей точкой.
В противном случае используется структурное равенство, которое не соответствует стандарту, поэтому NaN равно самому себе, NaN считается больше любого другого элемента, включая POSITIVE_INFINITY, и -0.0 не равно 0.0.
© 2010–2023 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/equality.html