Для будущих учащихся на курсе "Kotlin Backend Developer" подготовили перевод полезного материала.
Также приглашаем посмотреть открытый урок по теме "Kotlin multiplatform: Front/Back на одном языке".
В языке Kotlin существует три способа проверки на равенство:
Первый способ сравнение структур (==)
Оператор ==
в Kotlin позволяет сравнивать данные,
содержащиеся в переменных. Однако в Java этот оператор используется
для сравнения ссылок двух переменных.
В случае пользовательских классов ==
можно
использовать для сравнения содержимого data-классов. В остальных
случаях этот оператор сравнивает ссылки.
Второй способ сравнение ссылок (===)
Оператор ===
в Kotlin используется для сравнения
ссылок двух переменных. Однако в случае примитивов ===
является эквивалентом ==
, то есть выполняет проверку
значений.
Третий способ метод equals
Метод equals
выполняет в Kotlin ту же функцию, что
и ==
.
Однако между методом equals
и оператором
==
возникает разница в случае сравнения переменных
типа Float
и Double
. Если при сравнении
переменных типа Float
и Double
с помощью
==
применяется стандартIEEE 754, то в случае
с equals
это не так, поэтому при использовании
equals
считается, что:
-
NaN равен самому себе;
-
NaN больше, чем любой другой элемент, включая
POSITIVE_INFINITY
; -
0,0 меньше, чем 0,0.
Рассмотрим примеры ниже, чтобы лучше понять, как происходит сравнение в разных случаях.
1. Сравнение примитивов
val firstInt = 5val secondInt = 5println(firstInt == secondInt) // trueprintln(firstInt === secondInt) // trueprintln(firstInt.equals(secondInt)) // true
В случае примитивных типов данных сравниваются содержащиеся в них значения.
2. Сравнение примитивов в обертке
val firstInt = Integer(5)val secondInt = Integer(5)println(firstInt == secondInt) // trueprintln(firstInt === secondInt) // falseprintln(firstInt.equals(secondInt)) // true
Здесь firstInt
и secondInt
имеют
разные ссылки. Поэтому сравнение ссылок (===
)
возвращает результат false
. При проверке равенства
структуры и использовании метода equals
проверяется
только содержимое. Следовательно, результатом проверки будет
true
, поскольку значение обеих переменных равно
5
.
3. Сравнение объектов пользовательских классов
class Student(val name : String)val student1 = Student(Jasmeet)val student2 = Student(Jasmeet)println(student1 === student2) // falseprintln(student1 == student2) // falseprintln(student1.equals(student2)) // falseprintln(student1.name === student2.name) // trueprintln(student1.name == student2.name) // trueprintln(student1.name.equals(student2.name)) // true
В данном случае student
не является ни примитивом,
ни оберткой, поэтому во всех случаях сравниваются ссылки, а не
содержимое. Однако при сравнении строковых литералов содержимое
сравнивается так же, как и в Java.
Чтобы сравнение содержимого работало, нужно иметь дело с data-классом.
data class Student(val name : String)val student1 = Student(Jasmeet)val student2 = Student(Jasmeet)println(student1 === student2) // falseprintln(student1 == student2) // trueprintln(student1.equals(student2)) // true
4. Сравнение отрицательного и положительного нуля
val negativeZero = -0.0fval positiveZero = 0.0fprintln(negativeZero == positiveZero) // trueprintln(negativeZero.equals(positiveZero)) // false
Как уже упоминалось, при сравнении отрицательного нуля и
положительного нуля с использованием оператора ==
применяется стандарт IEEE 754. В результате возвращается значение
true
. При использовании же метода equals
этот стандарт не применяется, поэтому возвращается значение
false
.
Использованные материалы: https://kotlinlang.org/docs/reference/equality.html
Узнать подробнее о курсе "Kotlin Backend Developer".
Посмотреть открытый урок по теме "Kotlin multiplatform: Front/Back на одном языке".