Kotlin — Типы данных на практике
Типы данных в Kotlin похожи на те, что есть в Java и других языках программирования, однако имеют свои особенности. Во первых, тут нет примитивных типов данных, в Kotlin используются ссылочные типы данных: Int, Double, String и тд. Во вторых переменные по умолчанию не умеют хранить null, эта опция доступна только, если к типу данных добавить знак вопроса — «?». Так же все переменные по умолчанию неизменяемые, то есть значение можно задать только один раз.
Посмотреть как создать Kotlin приложение с нуля, и с чего вообще начать можно в предыдущей статье, где мы разбирали Kotlin, Gradle и базовые концепции языка.
Итак, вот самые популярные типы данных:
- Int. Целые числа в диапазоне от -2,147,483,648 (-2^31) до 2,147,483,647 (2^31- 1). Размер 32 бита (4 байта)
- Double. Дробные числа в диапазоне от -1.7E+308 до 1.7E+308. Размер 64 бита (8 байт)
- String. Текстовая информация. Размер зависит от данных, а также версии JVM
- Boolean. Хранит либо true, либо false Размер зависит от версии JVM
Типы, которые используются значительно реже
- Byte. Целые числа в диапазоне от -128 до 127. Размер 8 бит (1 байт)
- Short. Целые числа в диапазоне от -32768 до 32767. Размер 16 бит (2 байта)
- Long. Целые числа в диапазоне от -9,223,372,036,854,775,808 (-2^63) до 9,223,372,036,854,775,807 (2^63- 1). Размер 64 бита (8 байт)
- Float. Дробные числа в диапазоне от -3.4E+38 до 3.4E+38. Размер 32 бита (4 байта)
- Char. Символы (текст). Размер 16 бит (2 байта)
int value = 5; double sum = 10.5; String text = "Hello Java";
var value: Int = 5 var sum: Double = 10.5 var text: String = "Hello Kotlin"
Такие переменные в Kotlin не умеют хранить null. Для того, что бы можно было хранить «нули», необходимо добавить знак вопроса к типу данных — «?».
var value: Int? = null var sum: Double? = null var text: String? = null
Изменяемые (mutable) и неизменяемые (immutable) переменные
Все переменные в Kotlin должны быть помечены ключевым словом var или val. Если var — значит это изменяемая (mutable) переменная, если val — значит неизменяемая (immutable) переменная, то есть та, которую можно инициализировать только один раз. Рекомендуется использовать неизменяемые переменные везде, где это возможно.
Signed и Unsigned переменные
Все стандартные переменные, которые мы разобрали выше — это Signed. Однако есть еще один тип: Unsigned. Такие переменные в отличии от стандартных, не умеют хранить отрицательные числа. Их преимуществом является то, что они занимают столько же место как и Signed, но могут хранить в два раза больше положительных чисел. То есть, место которое могло потратиться на диапазон отрицательных чисел, у Unsigned переменных переходит в диапазон положительных чисел. Название таких типов совпадает с стандартными, но имеет префикс «U».
- UByte. Целые числа в диапазоне от 0 до 255. Размер 8 бит (1 байт)
- UShort. Целые числа в диапазоне от 0 до 65535. Размер 16 бит (2 байта)
- UInt. Целые числа в диапазоне от 0 до 4294967294. Размер 32 бита (4 байта)
- ULong. Целые числа в диапазоне от 0 до 2^64 — 1. Размер 64 бита (8 байт)
Java kotlin типы данных
В Kotlin все компоненты программы, в том числе переменные, представляют объекты, которые имеют определенный тип данных. Тип данных определяет, какой размер памяти может занимать объект данного типа и какие операции с ним можно производить. В Kotlin есть несколько базовых типов данных: числа, символы, строки, логический тип и массивы.
Целочисленные типы
- Byte : хранит целое число от -128 до 127 и занимает 1 байт
- Short : хранит целое число от -32 768 до 32 767 и занимает 2 байта
- Int : хранит целое число от -2 147 483 648 (-2 31 ) до 2 147 483 647 (2 31 — 1) и занимает 4 байта
- Long : хранит целое число от –9 223 372 036 854 775 808 (-2 63 ) до 9 223 372 036 854 775 807 (2 63 -1) и занимает 8 байт
В последней версии Kotlin также добавлена поддержка для целочисленных типов без знака:
- UByte : хранит целое число от 0 до 255 и занимает 1 байт
- UShort : хранит целое число от 0 до 65 535 и занимает 2 байта
- UInt : хранит целое число от 0 до 2 32 — 1 и занимает 4 байта
- ULong : хранит целое число от 0 до 2 64 -1 и занимает 8 байт
Объекты целочисленных типов хранят целые числа:
Для передачи значений объектам, которые представляют беззнаковые целочисленные типы данных, после числа указывается суффикс U :
Кроме чисел в десятичной системе мы можем определять числа в двоичной и шестнадцатеричной системах.
Шестнадцатеричная запись числа начинается с 0x , затем идет набор символов от 0 до F, которые представляют число:
val address: Int = 0x0A1 // 161 println(address) // 161
Двоичная запись числа предваряется символами 0b , после которых идет последовательность из нулей и единиц:
val a: Int = 0b0101 // 5 val b: Int = 0b1011 // 11 println(a) // 5 println(b) // 11
Числа с плавающей точкой
Кроме целочисленных типов в Kotlin есть два типа для чисел с плавающей точкой, которые позволяют хранить дробные числа:
- Float : хранит число с плавающей точкой от -3.4*10 38 до 3.4*10 38 и занимает 4 байта
- Double : хранит число с плавающей точкой от ±5.0*10 -324 до ±1.7*10 308 и занимает 8 байта.
В качестве разделителя целой и дробной части применяется точка:
val height: Double = 1.78 val pi: Float = 3.14F println(height) // 1.78 println(pi) // 3.14
Чтобы присвоить число объекту типа Float после числа указывается суффикс f или F .
Также тип Double поддерживает экспоненциальную запись:
val d: Double = 23e3 println(d) // 23 000 val g: Double = 23e-3 println(g) // 0.023
Логический тип Boolean
Тип Boolean может хранить одно из двух значений: true (истина) или false (ложь).
val a: Boolean = true val b: Boolean = false
Символы
Символьные данные представлены типом Char . Он представляет отдельный символ, который заключается в одинарные кавычки.
val a: Char = 'A' val b: Char = 'B' val c: Char = 'T'
Также тип Char может представлять специальные последовательности, которые интерпретируются особым образом:
- \t : табуляция
- \n : перевод строки
- \r : возврат каретки
- \’ : одинарная кавычка
- \» : двойная кавычка
- \\ : обратный слеш
Строки
Строки представлены типом String . Строка представляет последовательность символов, заключенную в двойные кавычки, либо в тройные двойные кавычки.
Строка может содержать специальные символы или эскейп-последовательности. Например, если необходимо вставить в текст перевод на другую строку, можно использовать эскейп-последовательность \n:
val text: String = "SALT II was a series of talks between United States \n and Soviet negotiators from 1972 to 1979"
Для большего удобства при создании многострочного текста можно использовать тройные двойные кавычки:
Шаблоны строк
Шаблоны строк (string templates) представляют удобный способ вставки в строку различных значений, в частности, значений переменных. Так, с помощью знака доллара $ мы можем вводить в строку значения различных переменных:
В данном случае вместо $firstName и $lastName будут вставляться значения этих переменных. При этом переменные необязательно должны представлять строковый тип:
val name = "Tom" val age = 22 val userInfo = "Your name: $name Your age: $age"
Выведение типа
Kotlin позволяет выводить тип переменной на основании данных, которыми переменная инициализируется. Поэтому при инициализации переменной тип можно опустить:
В данном случае компилятор увидит, что переменной присваивается значение типа Int, поэтому переменная age будет представлять тип Int.
Соответственно если мы присваиваем переменной строку, то такая переменная будет иметь тип String.
Любые целые числа, воспринимаются как данные типа Int .
Если же мы хотим явно указать, что число представляет значение типа Long, то следует использовать суффикс L:
Если надо указать, что объект представляет беззнаковый тип, то применяется суффикс u или U :
Аналогично все числа с плавающей точкой (которые содержат точку в качестве разделителя целой и дробной части) рассматриваются как числа типа Double:
Если мы хотим указать, что данные будут представлять тип Float, то необходимо использовать суффикс f или F :
Однако нельзя сначала объявить переменную бз указания типа, а потом где-то в программе присвоить ей какое-то значение:
val age // Ошибка, переменная не инициализирована age = 5
Статическая типизация и тип Any
Тип данных ограничивает набор значений, которые мы можем присвоить переменной. Например, мы не можем присвоить переменной типа Double строку:
И после того, как тип переменной установлен, он не может быть изменен:
Однако в Kotlin также есть тип Any , который позволяет присвоить переменной данного типа любое значение: