Массивы в 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] — правильно