Ответ
Примитивные типы (Int, Boolean, Double и др.) хранятся в стеке и содержат непосредственно значение, что делает операции с ними быстрее. Ссылочные типы (классы) хранятся в куче, а в стеке содержится только ссылка на объект.
Ключевые отличия:
- Примитивы работают быстрее, но имеют ограниченный функционал
- Ссылочные типы поддерживают наследование, nullability и сложную логику
// Примитив (оптимизируется JVM в int)
val a: Int = 10
// Ссылочный тип
val b: Int? = null
Kotlin автоматически выбирает оптимальное представление: примитив по умолчанию, но при использовании nullable или generics становится ссылочным.
Ответ 18+ 🔞
Да ты послушай, какой тут интересный расклад получается! Вот сидишь ты, пишешь на Kotlin, и вроде всё просто, а под капотом-то целый цирк с конями. Смотри, есть у нас примитивные типы — ну, типа Int, Boolean, Double. Это как быстрые, юркие курьеры: они прямо в стеке живут, со значением в кармане. Никаких тебе формальностей, прибежал — отдал. Скорость, блядь, просто овердохуища!
А есть ссылочные типы — это уже как менеджеры в дорогих костюмах. Сам объект сидит где-то на складе (в куче), а в стеке у тебя только бумажка с адресом этого склада. Чтобы с ним работать, надо сначала по адресу сходить. Зато они могут всё: и наследников заводить, и в null превращаться, и логику сложную строить. Но и возни с ними, ёпта, побольше.
Короче, в чём разница-то, спросишь ты?
- Примитивы — быстрые и простые, но туповатые. Как солдат-срочник: делает что велят, но фантазии ноль ебать.
- Ссылочные типы — умные и гибкие, но тормознутые. Как профессор: тебе целую лекцию прочитает, но пока доберётся до сути, уже спать захочется.
// Вот смотри, тут Kotlin умничает и делает примитив (в итоге int)
val a: Int = 10 // Быстро, как хуй с горы!
// А тут уже nullable, значит, нужна ссылка. Объект, ёбана!
val b: Int? = null // Теперь это уже полноценный класс, может быть null.
И вся соль в том, что Kotlin — он хитрая жопа. Сам решает, как ему выгоднее. По умолчанию старается всё в примитивы оптимизировать, чтоб быстрее было. Но как только ты начинаешь юзать nullable-типы или generics — всё, приехали, брат. Тут же превращает это в ссылочный тип, потому что иначе никак. Умная, блядь, система, сам от неё иногда охуеваю. Чистая магия, а не язык!