Разлика между операторите “==” и “===” в Kotlin

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, така че трябва да е лесно да се импортира и да се изпълнява както е.