Что такое ссылочные типы данных

Ответ

Ссылочный тип данных (reference type) — это тип, который хранит ссылку на объект в памяти, а не само значение. В отличие от примитивных типов (int, boolean и т. д.), переменные ссылочного типа указывают на область в куче (heap), где хранится объект.

Примеры ссылочных типов в Java/Kotlin:

  • Классы (String, ArrayList, пользовательские классы)
  • Интерфейсы
  • Массивы

Пример:

val list1 = mutableListOf(1, 2, 3)
val list2 = list1  // Обе переменные ссылаются на один объект
list2.add(4)
println(list1) // [1, 2, 3, 4] - изменение через list2 отразилось на list1

Особенности:

  • Работают через ссылки
  • Могут быть null (в Kotlin — если явно объявлены как nullable)
  • Хранятся в куче
  • Сравнение через == проверяет ссылки, а не содержимое (в Kotlin для содержимого используется contentEquals или equals)

Ответ 18+ 🔞

Э, слушай, а вот объясни мне, как этот ваш ссылочный тип работает, а то я тут на костылях своих ебучих сижу и думаю. Ну, типа, есть примитивы — там всё просто, как палка: вот тебе int, вот тебе boolean, держи значение и не парься. А вот эти ваши ссылочные типы — это уже ёперный театр, чувак.

Представь себе: у тебя есть объект, здоровенный такой, с полями, методами, овердохуища всего. Он лежит где-то там, в куче (это типа склад такой в памяти). А у тебя в руках — не сам этот ящик, а бумажка с адресом, где он лежит. Вот эта бумажка — и есть ссылка. Переменная list1 — это не список, это записка «иди на склад, в секцию 0xABADBABE, там найдёшь».

И вот в чём прикол, блядь. Берёшь ты эту записку, копируешь — val list2 = list1. Теперь у тебя две одинаковых бумажки с одним адресом. И если ты пошёл по адресу с копией и там в ящик хуйню какую-то добавил (list2.add(4)), то потом придёшь с оригинальной бумажкой — а там уже изменённый ящик! Обе переменные тыкают в одну и ту же хуйню в памяти. Вот поэтому println(list1) выдаст [1, 2, 3, 4]. Сам от такого охуеешь сначала.

А ещё они, сволочи, могут быть null. То есть бумажка есть, а на ней написано «адрес неизвестен, иди на хуй». В Kotlin, правда, умнее — надо явно сказать, что твоя ссылка может быть такой пустышкой, иначе компилятор тебе вмандит ошибку.

И главный подвох — сравнение. Ты думаешь, == — это проверить, одинаковые ли в ящиках носки? Хуй там! == для ссылок — это проверить, ведут ли обе бумажки на один и тот же складский ящик. Содержимое может быть идентичным, но если объекты разные (лежат в разных местах кучи), то == скажет «false, иди отсюда». Чтобы сравнить именно содержимое, надо использовать equals() или contentEquals() для массивов. Вот такая, блядь, хитрая жопа получается.

Короче, запомни: работаешь со ссылками — работаешь с адресами. Изменил что-то по одному адресу — всем, у кого он записан, будет сюрприз. Волнение, блядь, на каждом шагу.