1. Общ преглед
В тази статия ще говорим за разликата между операторите “==” и “===” в Kotlin .
В Kotlin, точно както в Java, имаме две различни концепции за равенство, референтно равенство и структурно равенство .
2. Референтно равенство
За референтно равенство използваме символа ===, който ни позволява да оценим референцията на обект (ако той сочи към същия обект). Това е еквивалент на оператора “==” в Java.
Да приемем, че имаме дефинирани две цели числа:
val a = Integer(10) val b = Integer(10)
и ги проверяваме и двамата, като правим === b , което ще върне false, защото те са два отделни обекта, всеки сочещ към различно място в паметта.
3. Структурно равенство
Сега за структурно равенство използваме символа ==, който оценява дали и двете стойности са еднакви (или равни). Това обикновено се постига чрез прилагане на метод equals () в Java.
Така че, използвайки същия пример Integers , просто трябва да направим a == b и в този случай той ще върне true , тъй като и двете променливи имат една и съща стойност.
4. Сравняване на сложни обекти
Ако искаме да проверим равенството на по-сложни обекти, символите ще се държат по същия начин. Да приемем, че имаме Потребител , който има списък с хобита:
data class User(val name: String, val age: Int, val hobbies: List)
В === ще провери референтна равенство и по удобно с помощта на списъка можем да се възползваме, че == оператор, който ще провери обекта и данните, съдържащи се в списъка .
5. Масиви Равенство
За Масивите, като на Kotlin 1.1, можем да проверим структурната равенство с помощта на инфикс функции contentEquals и contentDeepEquals :
val hobbies = arrayOf("Hiking, Chess") val hobbies2 = arrayOf("Hiking, Chess") assertTrue(hobbies contentEquals hobbies2)
6. Заключение
Този бърз урок показа разликата между референтното и структурното равенство в Kotlin , чрез много прост пример.
Както винаги, изпълнението на всички тези примери и фрагменти може да бъде намерено в GitHub.
Имайте предвид, че това е проект, базиран на Maven, така че трябва да е лесно да се импортира и да се изпълнява както е.