Avatar ·

Как инициализировать массив в 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]

Этот подход удобен, когда нужно создать последовательность чисел без ручного перечисления.