Как работают примитивы в Kotlin
В Kotlin примитивные типы данных (например, Int
, Double
, Boolean
и другие) представлены как объекты, что обеспечивает удобство и безопасность языка. Однако под капотом Kotlin использует примитивные типы JVM для оптимизации производительности. Рассмотрим подробнее, как это работает:
Целочисленные типы:
Byte
(8 бит)Short
(16 бит)Int
(32 бита)Long
(64 бита)Вещественные типы:
Float
(32 бита)Double
(64 бита)Символьный тип:
Char
(16 бит)Логический тип:
Boolean
(представляет true
или false
)В Kotlin все типы являются объектами, что позволяет использовать их как объекты класса. Например, Int
в Kotlin — это не примитивный тип, а класс kotlin.Int
. Однако, для повышения производительности, компилятор Kotlin оптимизирует использование примитивных типов JVM там, где это возможно.
При компиляции Kotlin-кода в байт-код JVM компилятор старается использовать примитивные типы JVM (int
, double
, boolean
и т.д.) вместо их объектных оберток (Integer
, Double
, Boolean
и т.д.). Это позволяет избежать накладных расходов на создание объектов и повышает производительность.
fun add(a: Int, b: Int): Int {
return a + b
}
В данном случае, при компиляции в байт-код JVM будет использован примитивный тип int
для параметров и возвращаемого значения, что обеспечивает эффективное выполнение операции сложения.
Когда требуется использовать объектные типы (например, при работе с коллекциями, которые не поддерживают примитивные типы), Kotlin автоматически выполняет упаковку (boxing
) и распаковку (unboxing
) примитивных типов.
val list: List<Int> = listOf(1, 2, 3)
Здесь числа 1
, 2
, 3
автоматически упаковываются в объекты Integer
для хранения в списке. Почему в коллекциях не используются примитивные типы
Если тип данных объявлен как nullable
(например, Int?
), то он всегда представлен объектом, даже если исходный тип является примитивным. Это связано с тем, что примитивные типы не могут быть null
.
val number: Int? = null