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

kovserg
Когда можно будет вызывать kotlin из sublime, что бы не было стыдно за 8 секундные задержки? При знакомстве с языком это первое что портит всё впечатление от языка.
Nihiroz
Мне кажется, что Kotlin стоит изучать в родной для него среде — IntelliJ IDEA
kovserg
Почему вам так кажется? Что в IDEA появился playground как в xcode?
ps: даже в IDEA после создания проекта и скачки jdk и других телодвижений, запуск кода более 1сек. А в sublime просто открыли файл нажили ctrl+b и всё. Для изучения самое оно, если бы только не грустная скорость компиляции, вернее время запуска самого компилятора.
koperagen
Есть несколько REPL для котлина: расширение для jupyter notebook, собственно Kotlin REPL внутри IDEA и отдельные файлы Worksheet тоже для IDEA. Предположу, что последнее имеет сходство с playground из xcode. Все три хорошо справляются с быстрым запуском фрагментов кода, но немного для разных целей. Рекомендую
kovserg
Нашел вариант проще: play.kotlinlang.org