Равенство
В Kotlin есть два типа равенства:
Структурное равенство (
==) — проверка функцииequals()Ссылочное равенство (
===) — проверка того, что две ссылки указывают на один и тот же объект
Структурное равенство
Структурное равенство проверяет, одинаково ли содержимое или структура двух объектов. Структурное равенство проверяется с помощью операции == и её отрицательной формы !=. По соглашению выражение вида a == b преобразуется в:
a?.equals(b) ?: (b === null)
Если a не является null, вызывается функция equals(Any?). В противном случае (если a является null) проверяется, что b ссылочно равно null:
fun main() {
var a = "hello"
var b = "hello"
var c = null
var d = null
var e = d
println(a == b)
// true
println(a == c)
// false
println(c == e)
// true
}
Обратите внимание: нет смысла оптимизировать код, если явно сравнивать с null: a == null автоматически преобразуется в a === null.
В Kotlin функция equals() наследуется всеми классами от класса Any. По умолчанию функция equals() реализует ссылочное равенство. Однако классы в Kotlin могут переопределять функцию equals(), чтобы задать собственную логику равенства и таким образом реализовать структурное равенство.
Классы-значения и классы данных — два особых типа в Kotlin, которые автоматически переопределяют функцию equals(). Поэтому по умолчанию они реализуют структурное равенство.
Однако для классов данных, если функция equals() помечена как final в родительском классе, её поведение не меняется.
В отличие от них, обычные классы (не объявленные с модификатором data) по умолчанию не переопределяют функцию equals(). Вместо этого обычные классы реализуют поведение ссылочного равенства, унаследованное от класса Any. Чтобы реализовать структурное равенство, обычным классам необходимо задать собственную логику равенства, переопределив функцию equals().
Чтобы задать собственную реализацию проверки равенства, переопределите функцию equals(other: Any?): Boolean:
class Point(val x: Int, val y: Int) {
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (other !is Point) return false
// Compares properties for structural equality
return this.x == other.x && this.y == other.y
}
}
Функции с таким же именем, но другими сигнатурами (например, equals(other: Foo)) не влияют на проверки равенства с помощью операторов == и !=.
Структурное равенство не связано со сравнением, определённым интерфейсом Comparable<...>, поэтому на поведение оператора может повлиять только пользовательская реализация equals(Any?).
Ссылочное равенство
При ссылочном равенстве проверяются адреса в памяти двух объектов, чтобы определить, являются ли они одним и тем же экземпляром.
Ссылочное равенство проверяется с помощью операции === и её отрицательной формы !==. a === b принимает значение true тогда и только тогда, когда a и b указывают на один и тот же объект:
fun main() {
var a = "Hello"
var b = a
var c = "world"
var d = "world"
println(a === b)
// true
println(a === c)
// false
println(c === d)
// true
}
Для значений, представленных во время выполнения примитивными типами (например, Int), проверка равенства === эквивалентна проверке ==.
Равенство чисел с плавающей запятой
Если статически известно, что операнды проверки равенства имеют тип Float или Double (nullable или нет), проверка выполняется в соответствии со стандартом IEEE 754 для арифметики с плавающей запятой.
Для операндов, статический тип которых не является типом с плавающей запятой, поведение отличается. В таких случаях реализуется структурное равенство. В результате проверки с операндами, статический тип которых не является типом с плавающей запятой, отличаются от стандарта IEEE. В этом случае:
NaNравно самому себеNaNбольше любого другого элемента (включаяPOSITIVE_INFINITY)-0.0не равно0.0
Подробнее см. в разделе Сравнение чисел с плавающей запятой.
Равенство массивов
Чтобы проверить, содержат ли два массива одинаковые элементы в одинаковом порядке, используйте contentEquals().
Подробнее см. в разделе Сравнение массивов.
© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/equality.html