Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗ktPmArPmA 180 of 522 menu
◀ ▶

Примитивные массивы в 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')

Явно укажите тип этой переменной.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить