Примитивные массивы в Kotlin
До сих пор массив чисел получали через
arrayOf. Тип такого массива записывают
в угловых скобках:
val arr: Array<Int> = arrayOf(1, 2, 3)
В ячейке этого массива нет самого числа. Там лежит адрес отдельного объекта, а число хранится внутри объекта. Кроме четырех байт числа объект занимает место еще и под служебные данные.
Кусок массива в памяти по-прежнему сплошной, но это ряд адресов. Сами числа лежат в других местах, по одному объекту на число. Чтение элемента идет в два шага: сначала из ячейки берут адрес, затем по этому адресу читают число.
Есть более плотная форма. Ее называют
примитивным массивом: в ячейке лежит
само число, без объекта вокруг. У обычного
целого ячейка занимает 4 байта.
Адрес ячейки считают прежней формулой:
начало куска плюс индекс, умноженный на
размер ячейки. Размер ячейки здесь равен
размеру числа, поэтому чтение сразу
попадает в число, а весь кусок короче.
Такой массив создают отдельной функцией. Тип пишут без угловых скобок. В имени уже есть и массив, и тип элемента:
val arr: IntArray = intArrayOf(1, 2, 3)
К элементу обращаются по индексу, как и раньше. На экран массив выводят той же функцией:
val arr: IntArray = intArrayOf(1, 2, 3)
println(arr[0]) // 1
println(arr.contentToString()) // [1, 2, 3]
Массив известной длины без готовых чисел создают именем типа. Пустые ячейки целых заполнены нулями:
val arr: IntArray = IntArray(3)
println(arr.contentToString()) // [0, 0, 0]
Та же плотная запись есть у больших целых, дробей и отдельных символов. Ширина ячейки совпадает с шириной одного значения:
| Тип | Функция | Ячейка |
|---|---|---|
IntArray
|
intArrayOf
|
Int, 4 байта
|
LongArray
|
longArrayOf
|
Long, 8 байт
|
FloatArray
|
floatArrayOf
|
Float, 4 байта
|
DoubleArray
|
doubleArrayOf
|
Double, 8 байт
|
CharArray
|
charArrayOf
|
Char, 2 байта
|
В коде у каждого типа своя функция:
val arr1: LongArray = longArrayOf(1L, 2L, 3L)
val arr2: DoubleArray = doubleArrayOf(1.5, 2.5, 3.5)
val arr3: FloatArray = floatArrayOf(1.5f, 2.5f, 3.5f)
val arr4: CharArray = charArrayOf('a', 'b', 'c')
Строку так не уплотняют. Длина строки заранее
не известна и у разных строк разная, поэтому
в ячейку кладут адрес объекта строки.
Короткого имени у такого массива нет.
Остается тип Array<String>.
Одни и те же числа 1, 2, 3
дают разный тип. Функция arrayOf
собирает массив объектов, а intArrayOf
кладет числа прямо в ячейки:
val arr1 = arrayOf(1, 2, 3) // Array<Int>
val arr2 = intArrayOf(1, 2, 3) // IntArray
Тип плотного массива можно не указывать. Kotlin сам выведет его по функции:
val arr1 = intArrayOf(1, 2, 3) // IntArray
val arr2 = longArrayOf(1L, 2L, 3L) // LongArray
val arr3 = doubleArrayOf(1.5, 2.5, 3.5) // DoubleArray
val arr4 = floatArrayOf(1.5f, 2.5f, 3.5f) // FloatArray
val arr5 = charArrayOf('a', 'b', 'c') // CharArray
Дан массив:
val nums = intArrayOf(1, 2, 3)
Явно укажите тип этой переменной.
Дан массив:
val big = longArrayOf(4L, 5L, 6L)
Явно укажите тип этой переменной.
Дан массив:
val parts = doubleArrayOf(1.5, 2.5)
Явно укажите тип этой переменной.
Дан массив:
val weights = floatArrayOf(1.5f, 2.5f)
Явно укажите тип этой переменной.
Дан массив:
val letters = charArrayOf('x', 'y', 'z')
Явно укажите тип этой переменной.