Pull to refresh
813.36
OTUS
Цифровые навыки от ведущих экспертов

Проверка на равенство в Kotlin

Reading time3 min
Views13K
Original author: Jasmeet Kaur

Для будущих учащихся на курсе "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 = 5
val secondInt = 5

println(firstInt == secondInt)  // true
println(firstInt === secondInt) // true
println(firstInt.equals(secondInt)) // true

В случае примитивных типов данных сравниваются содержащиеся в них значения.

2. Сравнение примитивов в обертке

val firstInt = Integer(5)
val secondInt = Integer(5)
println(firstInt == secondInt)  // true
println(firstInt === secondInt) // false
println(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) // false
println(student1 == student2) // false
println(student1.equals(student2)) // false
println(student1.name === student2.name) // true
println(student1.name == student2.name) // true
println(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) // false
println(student1 == student2) // true
println(student1.equals(student2)) // true

4. Сравнение отрицательного и положительного нуля

val negativeZero = -0.0f
val positiveZero = 0.0f

println(negativeZero == positiveZero) // true
println(negativeZero.equals(positiveZero)) // false

Как уже упоминалось, при сравнении отрицательного нуля и положительного нуля с использованием оператора == применяется стандарт IEEE 754. В результате возвращается значение true. При использовании же метода equals этот стандарт не применяется, поэтому возвращается значение false.

Использованные материалы: https://kotlinlang.org/docs/reference/equality.html


Узнать подробнее о курсе "Kotlin Backend Developer".

Посмотреть открытый урок по теме "Kotlin multiplatform: Front/Back на одном языке".


ЗАБРАТЬ СКИДКУ

Tags:
Hubs:
+2
Comments5

Articles

Information

Website
otus.ru
Registered
Founded
Employees
101–200 employees
Location
Россия
Representative
OTUS