
В языке программирования Kotlin == и === — это два оператора, часто используемые для сравнения. Хотя на первый взгляд они могут показаться похожими, они служат совершенно разным целям и имеют разное поведение. В этой подробной статье мы углубимся в ключевые различия между == (оператором равенства) и === (оператором ссылочного равенства), приведя многочисленные примеры, иллюстрирующие их использование.
Понимание == (оператор равенства)
Оператор == в Котлине используется для структурного равенства. Проще говоря, он используется для сравнения значений двух объектов, независимо от того, являются ли они одним и тем же экземпляром в памяти.
Пример 1: Сравнение списков
val a = listOf(1, 2, 3) val b = listOf(1, 2, 3) val result = a == b // true, because the content of 'a' and 'b' is the samekot
В этом примере a и b — это два разных объекта в памяти, однако a == b возвращает true, поскольку содержимое (элементы) обоих списков идентично.
Пример 2: Сравнение строк
val str1 = "Hello" val str2 = "Hello" val result = str1 == str2 // true, because the content of 'str1' and 'str2' is the same
Аналогично, str1 == str2 оценивается как true, поскольку обе строки содержат одни и те же символы.
Общие сведения о === (оператор ссылочного равенства)
Напротив, оператор === используется для ссылочного равенства. Он определяет, указывают ли две ссылки на один и тот же объект в памяти.
Пример 1: Сравнение ссылок на объекты
val x = listOf(1, 2, 3) val y = x val result = x === y // true, because 'x' and 'y' reference the same object
Здесь x и y ссылаются на один и тот же объект списка, поэтому x === y возвращает true. Это связано с тем, что обе переменные указывают на одну и ту же ячейку памяти, указывая на то, что они являются одним и тем же объектом.
Пример 2: Сравнение экземпляров классов
class Person(val name: String)
val person1 = Person("Alice")
val person2 = Person("Alice")
val result = person1 === person2 // false, because 'person1' and 'person2' reference different objects
Несмотря на то, что person1 и person2 имеют одинаковое содержимое (оба представляют человека по имени «Алиса»), person1 === person2 оценивается как false, поскольку они ссылаются на разные экземпляры класса Person. Оператор проверяет, указывают ли ссылки на одну и ту же ячейку памяти, чего в данном случае нет.
Ключевые выводы
Подведем итог существенных различий между == и ===:
==используется для структурного равенства, сравнения содержимого или значений объектов.===используется для ссылочного равенства, определяя, указывают ли две ссылки на один и тот же объект в памяти.- При работе с примитивными типами данных (например,
Int,Boolean,Char)==и===ведут себя одинаково, поскольку эти типы хранятся в памяти как типы значений, а не ссылочные типы.
Заключение
В Kotlin операторы == и === служат разным целям: один для сравнения значений, а другой — для сравнения ссылок на объекты. Понимание этих различий имеет основополагающее значение для написания надежного и безошибочного кода. В зависимости от вашего конкретного варианта использования вы выберете == или === для выполнения соответствующего сравнения, гарантируя, что ваш код ведет себя должным образом и не содержит мелких ошибок, связанных со сравнением на равенство.