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

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Для будущих учащихся на курсе "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 на одном языке".


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

Источник: https://habr.com/ru/company/otus/blog/532270/


Интересные статьи

Интересные статьи

В данной статье мы рассмотрим понятие моноид и узнаем, как он может помочь нам при сортировке данных. Интересующихся функциональным программированием на Kotlin также приглашаю заглянут...
Это вторая из трёх статей о применении архитектурного шаблона MVI в Kotlin Multiplatform. В первой статье мы вспомнили, что такое MVI, и применили его для написания общего для iOS...
Компилятор GCC написан с обильным использованием макросов. Очередная проверка кода GCC с помощью PVS-Studio вновь подтверждает мнение нашей команды, что макросы – это плохо. В таком коде тяжело...
Прошлым летом я участвовал в Google Summer of Code — программе для студентов от компании Google. Ежегодно организаторы отбирают несколько Open Source-проектов, в том числе от таких известных орга...
Telegram Open Network (TON) — это платформа от создателей мессенджера Telegram, которая, помимо блокчейна, содержит в себе большой набор сервисов. Недавно разработчики опубликовали код платформ...