В языке программирования 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 операторы == и === служат разным целям: один для сравнения значений, а другой — для сравнения ссылок на объекты. Понимание этих различий имеет основополагающее значение для написания надежного и безошибочного кода. В зависимости от вашего конкретного варианта использования вы выберете == или === для выполнения соответствующего сравнения, гарантируя, что ваш код ведет себя должным образом и не содержит мелких ошибок, связанных со сравнением на равенство.