Инициализация массива в Kotlin: 5 способов с примерами кода

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Массивы в Kotlin: не бойтесь, это просто

Если вы переходите с Java на Kotlin или только начинаете изучать этот современный язык, вопрос «как инициализировать массив в Kotlin с значениями» возникает почти сразу. На Stack Overflow этот топик собрал тысячи просмотров — значит, тема действительно важная.

Хорошая новость: Kotlin сделал работу с массивами намного удобнее, чем в Java. Плохая новость: есть несколько способов, и новички часто путаются. Давайте раз и навсегда разберем все варианты инициализации массива Kotlin — от простого к сложному, с реальными примерами кода.

1. Самый простой способ: arrayOf()

Функция arrayOf() — это ваш хлеб насущный. Она создает массив из переданных значений, автоматически определяя тип.

// Массив целых чисел
val numbers = arrayOf(1, 2, 3, 4, 5)

// Массив строк
val fruits = arrayOf("яблоко", "банан", "апельсин")

// Массив смешанного типа (Any)
val mixed = arrayOf(42, "Kotlin", true)

println(numbers.contentToString()) // [1, 2, 3, 4, 5]
println(fruits.contentToString())   // [яблоко, банан, апельсин]

Важно: arrayOf() создает Array<T> — объектный массив. Если вам нужны примитивные типы (int, char, boolean) для производительности, читайте дальше.

2. Примитивные массивы: intArrayOf(), doubleArrayOf() и другие

Kotlin предлагает специализированные функции для каждого примитивного типа. Они экономят память и работают быстрее:

// Целые числа
val intArr = intArrayOf(10, 20, 30, 40, 50)

// Числа с плавающей точкой
val doubleArr = doubleArrayOf(1.5, 2.7, 3.14)

// Логические значения
val boolArr = booleanArrayOf(true, false, true)

// Символы
val charArr = charArrayOf('K', 'o', 't', 'l', 'i', 'n')

// Байты
val byteArr = byteArrayOf(0x48, 0x65, 0x6C, 0x6C, 0x6F) // "Hello"

println(intArr.joinToString()) // 10, 20, 30, 40, 50

Полный список: intArrayOf, doubleArrayOf, floatArrayOf, longArrayOf, shortArrayOf, byteArrayOf, booleanArrayOf, charArrayOf.

Когда использовать? Если работаете с большими данными или пишете производительный код — берите примитивные массивы. Для обычных задач arrayOf() вполне достаточно.

3. Конструктор массива: Array(size) с лямбдой

Самый гибкий способ инициализации массива в Kotlin — использование конструктора с лямбда-выражением. Вы задаете размер и правило заполнения:

// Квадраты чисел от 0 до 4
val squares = Array(5) { i -> i * i }
println(squares.contentToString()) // [0, 1, 4, 9, 16]

// Массив из 10 случайных чисел
import kotlin.random.Random
val randoms = Array(10) { Random.nextInt(100) }
println(randoms.contentToString()) // [42, 17, 83, 5, 91, ...]

// Массив строк с шаблоном
val labels = Array(3) { index -> "Элемент #${index + 1}" }
println(labels.contentToString()) // [Элемент #1, Элемент #2, Элемент #3]

Лямбда получает индекс элемента (от 0 до size-1) и должна вернуть значение. Это мощный инструмент — вы можете заполнить массив по любому правилу, включая вызов функций.

4. arrayOfNulls() — массив с пустыми ячейками

Иногда нужно создать массив, а заполнить его позже. Для этого есть arrayOfNulls():

// Массив из 5 null-элементов
val nullArray = arrayOfNulls<String>(5)
println(nullArray.contentToString()) // [null, null, null, null, null]

// Заполняем позже
nullArray[0] = "Первый"
nullArray[2] = "Третий"
println(nullArray.contentToString()) // [Первый, null, Третий, null, null]

Тип нужно указывать явно — компилятор не может вывести его из null. Подходит для сценариев, где данные приходят постепенно (например, из базы данных или пользовательского ввода).

5. emptyArray() — пустой массив

Самый редкий, но полезный случай — пустой массив:

// Пустой массив строк
val empty = emptyArray<String>()
println(empty.size) // 0
println(empty.isEmpty()) // true

// Можно использовать для возврата из функции вместо null
fun getNames(): Array<String> {
    return if (someCondition) arrayOf("Анна", "Борис") else emptyArray()
}

Лучше, чем возвращать null — избавляет от лишних проверок.

Сравнение всех способов: шпаргалка

Чтобы вы не путались, вот краткая таблица:

  • arrayOf(1, 2, 3) — простой массив object-типа
  • intArrayOf(1, 2, 3) — примитивный массив int (быстрее)
  • Array(5) { i -> i * 2 } — массив с лямбда-инициализацией
  • arrayOfNulls<Type>(5) — массив с null-значениями
  • emptyArray<Type>() — пустой массив

Частые ошибки новичков

На Stack Overflow эти ошибки встречаются постоянно. Избегайте их:

Ошибка 1: Путаница между IntArray и Array<Int>

// Это разные типы!
val arr1: IntArray = intArrayOf(1, 2, 3)      // примитивный
val arr2: Array<Int> = arrayOf(1, 2, 3)       // объектный

// arr1 == arr2? — НЕТ, даже equals вернет false

Ошибка 2: Забываем про contentToString()

val arr = arrayOf(1, 2, 3)
println(arr) // [Ljava.lang.Integer;@1b6d3586 — бесполезно!
println(arr.contentToString()) // [1, 2, 3] — правильно

Ошибка 3: Поп

Блоги

Рекомендаций по книгам