Как сравнить объекты по ссылке в Kotlin

Ответ

В Kotlin для сравнения объектов по ссылке используется оператор === (и его отрицание !==). Он проверяет, ссылаются ли две переменные на один и тот же объект в памяти, в отличие от ==, который вызывает equals().

val a = "Hello"
val b = "Hello"
val c = a

println(a === b)  // false (разные объекты в памяти)
println(a === c)  // true (одна и та же ссылка)

Для nullable-типов:

val obj1: Any? = null
val obj2: Any? = null
println(obj1 === obj2)  // true (оба null)

Ответ 18+ 🔞

Ну вот, опять про эти операторы, ебать мои старые костыли. Сидишь такой, пишешь код, а потом бац — и нихуя не работает. А всё потому, что перепутал === с ==. Это, бля, как близнецы, только один — реальный пацан, а второй — его тень, которая через equals() шастает.

Смотри, чувак, вот тебе простая аналогия. Представь, что у тебя есть две одинаковые бутылки пива. Обе — «Балтика 9». По содержимому (==) они одинаковые, оба — крепкое говно. Но это две разные, ёпта, физические бутылки! Ты не можешь выпить из одной, а опьянеть от другой. Вот === — это как спросить: «Это одна и та же, блядь, бутылка в моей руке?». Если ты перелил из одной в другую — == скажет «да», а === — «иди нахуй, нет».

Вот, смотри на этот код, тут всё как на ладони.

val a = "Hello"
val b = "Hello"
val c = a

println(a === b)  // false (разные объекты в памяти)
println(a === c)  // true (одна и та же ссылка)

Видишь? a и b — это как два отдельных чувака, которые пришли на вечеринку в одинаковых костюмах. Для мира (==) они выглядят одинаково, но это два разных человека, понимаешь? А вот a и c — это один и тот же мужик, просто он представился два раза. Ссылка одна, объект один. === это и ловит.

А теперь самое интересное — nullable-типы, ёперный театр. Тут часто мозг сносит.

val obj1: Any? = null
val obj2: Any? = null
println(obj1 === obj2)  // true (оба null)

Смотри, какая хитрая жопа. Оба — null. А null — это не объект, это идея, понятие пустоты. Его в памяти нет, как такового. Поэтому, когда ты спрашиваешь: «Эй, obj1 и obj2 — это одна и та же пустота?», Kotlin такой: «Ну, а хули? Пустота она и в Африке пустота. Да, true». Это, бля, единственный случай, когда === для двух разных переменных может вернуть true, не потому что они ссылаются на один объект, а потому что они ссылаются на НИХУЯ. На один и тот же нихуя.

Так что запомни, чтобы не быть распиздяем: == — это «похожи как?», а === — это «один и тот же чувак?». Перепутаешь — будет тебе хиросима, а не работающая программа.