Разница между операторами «==» и «===» в Котлине
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, поэтому его легко импортировать и запускать как есть.