Как инициализировать массив в Kotlin с конкретными значениями?
Привет! Я только начал изучать Kotlin после Java и столкнулся с проблемой инициализации массивов. В Java я мог просто написать:
int[] numbers = {1, 2, 3, 4, 5};
Но в Kotlin это не работает. Я пробую разные варианты, но компилятор выдаёт ошибки или я получаю не то, что ожидаю.
Вот что я пробовал:
// Вариант 1 (не компилируется)
val numbers = {1, 2, 3}
// Вариант 2 (компилируется, но это не массив)
val numbers = arrayOf(1, 2, 3)
println(numbers) // Выводит ссылку, а не содержимое
// Вариант 3 (получаю массив с null)
val numbers = arrayOfNulls(5)
numbers[0] = 1
numbers[1] = 2
// Это неудобно, если нужно много значений
Я хочу создать массив целых чисел (Int, Double, String и т.д.) с конкретными значениями, которые я задаю сразу при объявлении. Как правильно это сделать в Kotlin?
Также интересует:
1. Можно ли создавать массивы примитивных типов (IntArray, DoubleArray) и в чём разница?
2. Как инициализировать массив с помощью лямбда-функции?
3. Есть ли разница между arrayOf и intArrayOf?
Буду благодарен за примеры кода с пояснениями. Заранее спасибо!
<<>>
>>
Основные способы инициализации массивов в Kotlin
В Kotlin массивы создаются с помощью специальных фабричных функций. Вот основные варианты:
// 1. Самый простой способ — arrayOf
val numbers = arrayOf(1, 2, 3, 4, 5)
val strings = arrayOf("Kotlin", "Java", "Python")
val mixed = arrayOf(1, "hello", 3.14) // Можно смешивать типы, но лучше избегать
// 2. Для примитивных типов — специальные функции
val intNumbers = intArrayOf(1, 2, 3, 4, 5)
val doubleNumbers = doubleArrayOf(1.0, 2.5, 3.14)
val booleanArray = booleanArrayOf(true, false, true)
Разница между arrayOf и intArrayOf
- arrayOf<Int>(...) создает массив с типом
Array<Int>— каждый элемент хранится как объект Integer (боксинг). - intArrayOf(...) создает массив с типом
IntArray— элементы хранятся как примитивные int (без боксинг). - Для больших массивов с числами intArrayOf работает быстрее и занимает меньше памяти.
Инициализация с помощью лямбда-функции
Kotlin позволяет создавать массивы с динамическим заполнением через конструктор Array(size) { lambda }:
// Квадраты чисел от 0 до 4
val squares = Array(5) { index -> index * index }
// Результат: [0, 1, 4, 9, 16]
// Случайные числа
val randomNumbers = Array(10) { Random.nextInt(100) }
// Значения по формуле
val customArray = Array(5) { i -> "Item #${i + 1}" }
// Результат: ["Item #1", "Item #2", "Item #3", "Item #4", "Item #5"]
Инициализация с null значениями
Если вам нужен массив с null, используйте arrayOfNulls:
val nullableArray = arrayOfNulls<String>(3)
// [null, null, null]
nullableArray[0] = "Kotlin"
// Теперь: ["Kotlin", null, null]
Как правильно вывести массив
Просто println(array) выводит ссылку. Используйте contentToString():
val numbers = arrayOf(1, 2, 3)
println(numbers.contentToString()) // [1, 2, 3]
// Для примитивных массивов:
val ints = intArrayOf(1, 2, 3)
println(ints.contentToString()) // [1, 2, 3]
Полный пример с разными типами
fun main() {
// Массив строк
val fruits = arrayOf("Apple", "Banana", "Cherry")
println(fruits.contentToString()) // [Apple, Banana, Cherry]
// Примитивный массив Int
val primes = intArrayOf(2, 3, 5, 7, 11)
println(primes.contentToString()) // [2, 3, 5, 7, 11]
// Массив Double
val prices = doubleArrayOf(19.99, 29.99, 49.99)
println(prices.contentToString()) // [19.99, 29.99, 49.99]
// Динамическое создание
val evenNumbers = Array(5) { it * 2 }
println(evenNumbers.contentToString()) // [0, 2, 4, 6, 8]
// Изменяемый массив
val mutableList = mutableListOf(1, 2, 3)
mutableList.add(4)
println(mutableList) // [1, 2, 3, 4] — работает без contentToString()
}
Рекомендации
- Для простых случаев используйте arrayOf или intArrayOf.
- Если массив большой и содержит примитивы — используйте IntArray, DoubleArray и т.д.
- Если нужно заполнить массив по формуле — используйте Array(size) { ... }.
- Для изменяемых коллекций рассмотрите mutableListOf — это более гибкий вариант.
Альтернативный подход: использование списков (List)
В Kotlin часто вместо массивов используют списки, так как они предоставляют больше возможностей:
// Неизменяемый список (аналог массива)
val numbers = listOf(1, 2, 3, 4, 5)
// Изменяемый список
val mutableNumbers = mutableListOf(1, 2, 3)
mutableNumbers.add(4)
mutableNumbers[0] = 10
// Преобразование списка в массив
val arrayFromList = numbers.toIntArray()
val arrayFromListGeneric = numbers.toTypedArray()
Когда использовать массивы, а когда списки
- Массивы — фиксированный размер, быстрее для примитивов, нужны для совместимости с Java.
- Списки — изменяемый размер, богатый API (filter, map, forEach), рекомендуется в Kotlin по умолчанию.
Создание массива из диапазона
// Диапазон чисел
val range = (1..10).toList().toIntArray()
println(range.contentToString()) // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
// Шаг
val stepRange = (0..20 step 5).toList().toIntArray()
println(stepRange.contentToString()) // [0, 5, 10, 15, 20]
Этот подход удобен, когда нужно создать последовательность чисел без ручного перечисления.