Разница между операторами "==" и "===" в Котлине

Разница между операторами «==» и «===» в Котлине

1. обзор

В этой статье мы поговорим оdifference between “==” and “===” operators in Kotlin.

В Kotlin, как и в Java, есть две разные концепции равенства:Referential equality иStructural equality.

2. Референтное равенство

Для ссылочного равенства мы используем символ===, который позволяет нам оценить ссылку на объект (если он указывает на тот же объект). Это эквивалент оператора «==» в Java.

Допустим, у нас определены два целых числа:

val a = Integer(10)
val b = Integer(10)

и мы проверяем их оба, выполняяa === b, который вернетfalse, потому что это два отдельных объекта, каждый из которых указывает на разные места в памяти.

3. Структурное равенство

Теперь для структурного равенства мы используем символ==, который оценивает, равны ли оба значения (или равны). Обычно это достигается путем реализации методаequals() в Java.

Итак, используя тот же примерIntegers, нам просто нужно выполнитьa == b, и в этом случае он вернетtrue, поскольку обе переменные имеют одинаковое значение.

4. Сравнение сложных объектов

Если мы хотим проверить равенство на более сложных объектах, символы будут вести себя одинаково. Допустим, у нас естьUser, у которого есть список увлечений:

data class User(val name: String, val age: Int, val hobbies: List)

=== будет проверять равенство ссылок, и, удобно используяList<>, мы можем воспользоваться преимуществом оператора==, который будет проверять объектand the data contained on the list.

5. Равенство массивов

ДляArrays,, начиная с Kotlin 1.1, мы можем проверить структурное равенство, используя функцииinfixcontentEquals иcontentDeepEquals:

val hobbies = arrayOf("Hiking, Chess")
val hobbies2 = arrayOf("Hiking, Chess")

assertTrue(hobbies contentEquals hobbies2)

6. Заключение

Это краткое руководство продемонстрировало разницу междуreferential and structural equality in Kotlin на очень простом примере.

Как всегда, реализацию всех этих примеров и фрагментов можно найти вover on GitHub.

Обратите внимание, что это проект на основе Maven, поэтому его легко импортировать и запускать как есть.