Spec-Zone.ru › Kotlin 2

Массивы

Массив — это структура данных, которая содержит фиксированное количество значений одного типа или его подтипов. Элементы массива упорядочены и доступны по индексу.

В Kotlin предусмотрены класс Array<T> и массивы примитивных типов.

Когда использовать массивы

Используйте массивы для взаимодействия с API Java или при низкоуровневых требованиях. Например, если вам нужны более высокие показатели производительности, чем обычно требуется приложениям, или вы хотите создать собственные структуры данных.

В большинстве случаев лучше использовать коллекции.

Функциональность

Массивы

Коллекции

Размер

Фиксированный

Зависит от типа

Неизменяемый вариант

Нет, массивы всегда изменяемы

Да (List и Set)

Добавление и удаление элементов

Нет встроенной поддержки.
Выделите память и скопируйте данные в новый массив

Да (изменяемые коллекции)

Структурное равенство с ==

Нет, сравниваются ссылки.
Вместо этого используйте .contentEquals()

Да

Примитивные значения

Массивы примитивных типов хранят значения
без упаковки

Обычно упакованы

Взаимодействие с Java

Соответствует T[]

Соответствует java.util.List и
java.util.Set

Фильтрация и преобразования
в функциональном стиле

Ограниченные возможности

Широкие возможности

Узнайте, как преобразовать массивы в коллекции.

Создание массивов

Для создания массивов можно использовать:

  • Функции arrayOf(), arrayOfNulls() или emptyArray().

  • Конструктор Array.

Объявление массива с помощью val не позволяет повторно присвоить значение переменной, но не делает содержимое доступным только для чтения. Элементы можно изменять как в массивах val, так и в массивах var. Это различие касается только ссылки, но не содержимого. Чтобы получить представление только для чтения, используйте коллекции.

Массив со значениями

Чтобы создать типизированный массив из заранее известных значений, используйте функцию arrayOf(). Kotlin автоматически выводит тип:

fun main() {
//sampleStart
    val simpleArray = arrayOf(1, 2, 3) // Array<Int>
    println(simpleArray.joinToString())
    // 1, 2, 3
//sampleEnd
}

Пустой массив

Чтобы создать массив без элементов, используйте функцию emptyArray(). Тип элементов можно указать слева или справа от знака присваивания:

val emptyArrayRight = emptyArray<String>()
val emptyArrayLeft: Array<String> = emptyArray()

Узнайте, как добавлять элементы в массив.

Массив со значениями null

Чтобы создать массив заданного размера, заполненный элементами null, используйте функцию arrayOfNulls():

fun main() {
//sampleStart
    val nullArray: Array<Int?> = arrayOfNulls(3)
    println(nullArray.joinToString())
    // null, null, null
//sampleEnd
}

Конструктор массива

Конструктор Array принимает размер массива и функцию, которая возвращает значения его элементов:

fun main() {
//sampleStart
    val zeroes = Array<Int>(3) { 0 }
    println(zeroes.joinToString())
    // 0, 0, 0
    
    val squares = Array(5) { i -> i * i }
    println(squares.joinToString())
    // 0, 1, 4, 9, 16
//sampleEnd
}

Вложенные массивы

Чтобы создать вложенный или многомерный массив, используйте массив массивов. Вложенные массивы могут иметь разные типы и размеры.

fun main() {
//sampleStart
    // Creates a two-dimensional array
    val twoDArray = Array(2) { Array<Int>(2) { 0 } }
    println(twoDArray.contentDeepToString())
    // [[0, 0], [0, 0]]

    // Creates a three-dimensional array
    val threeDArray = Array(3) { Array(3) { Array<Int>(3) { 0 } } }
    println(threeDArray.contentDeepToString())
    // [[[0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]]]
//sampleEnd
}

Массивы примитивных типов

Если использовать класс Array с примитивными значениями, компилятор упаковывает их в объекты. Чтобы избежать дополнительных затрат на упаковку, можно использовать специализированные массивы примитивных типов. Они не являются подклассами класса Array<T>, но предоставляют аналогичный набор функций и свойств.

Тип Kotlin

Эквивалент в Java

BooleanArray

boolean[]

ByteArray

byte[]

CharArray

char[]

DoubleArray

double[]

FloatArray

float[]

IntArray

int[]

LongArray

long[]

ShortArray

short[]

В Kotlin нет специального типа StringArray. String не является примитивным типом, поэтому используйте функции arrayOf() или arrayOf<String>() с автоматически выведенным типом.

Чтобы создать массив примитивных типов, воспользуйтесь одним из следующих способов:

  • Функции-конструкторы:

    fun main() {
    //sampleStart
        // Creates an Int array of size 5 with the values initialized to zero
        val primitiveTypeArray = IntArray(5)
        println(primitiveTypeArray.joinToString())
        // 0, 0, 0, 0, 0
    
        // Creates an Int array and takes an initializer function
        val squares = IntArray(5) { i -> i * i }
        println(squares.joinToString())
        // 0, 1, 4, 9, 16
    //sampleEnd
    }
    
  • Функции-фабрики:

    fun main() {
    //sampleStart
        // Creates an Int array with 5 elements
        val numbers = intArrayOf(1, 2, 3, 4, 5)
        println(numbers.joinToString())
        // 1, 2, 3, 4, 5
    
        // Creates a Char array with 3 elements
        val characters = charArrayOf('K', 't', 'l')
        println(characters.joinToString())
        // K, t, l
    
        // Creates a Double array with 3 elements
        val doubles = doubleArrayOf(0.22, 4.16, 0.5)
        println(doubles.joinToString()) 
        // 0.22, 4.16, 0.5
    //sampleEnd
    }
    

Чтобы преобразовать массивы примитивных типов в массивы объектных типов, используйте функцию .toTypedArray().

Чтобы преобразовать массивы объектных типов в массивы примитивных типов, используйте .toBooleanArray(), .toByteArray(), .toCharArray() и другие функции.

Работа с массивами

Массивы поддерживают многие из тех же операций, что и коллекции, включая итерацию, поиск, сортировку и преобразование. В Kotlin массивы можно использовать для передачи функции переменного количества аргументов или для выполнения операций непосредственно над массивами. В следующей таблице представлены наиболее распространённые свойства и функции:

Элемент

Возвращаемое значение

size

Количество элементов

indices

Диапазон допустимых индексов

lastIndex

Последний допустимый индекс

first() и last()

Первый и последний элементы

isEmpty() и isNotEmpty()

true, если массив пуст или не пуст

contains()

true, если массив содержит элемент

Подробнее о свойствах и функциях массивов см. в справочнике API.

В этом разделе рассматриваются некоторые наиболее распространённые операции.

Доступ к элементам и их изменение

Для доступа к элементам массива и их изменения используйте оператор индексированного доступа ([]):

fun main() {
//sampleStart
    val simpleArray = arrayOf(1, 2, 3)
    val twoDArray = Array(2) { Array<Int>(2) { 0 } }

    // Accesses the element and modifies it
    simpleArray[0] = 10
    twoDArray[0][0] = 2

    // Prints the modified element
    println(simpleArray[0]) 
    // 10
    println(twoDArray[0][0]) 
    // 2
//sampleEnd
}

При попытке обратиться по индексу за пределами массива во время выполнения Kotlin выдаст исключение ArrayIndexOutOfBoundsException.

Также можно использовать функцию fill(element, fromIndex, toIndex), чтобы заменить элементы в диапазоне на месте. fromIndex включается в диапазон, а toIndex — нет:

fun main() {
//sampleStart
    val arr = IntArray(3)
    println(arr.joinToString())
    // 0, 0, 0
    
   arr.fill(1)
   println(arr.joinToString())
   // 1, 1, 1
  
   arr.fill(0, 0, 2)
   println(arr.joinToString())
   // 0, 0, 1
//sampleEnd
}

В Kotlin массивы инвариантны. Это означает, что Array<String> не является подтипом Array<Any>. Это предотвращает возможные ошибки типов во время выполнения. Чтобы выразить ковариантность, используйте проекцию типа Array<out Any>:

fun main() {
//sampleStart
    fun printArr(arr: Array<out Any>) {
        for (item in arr) print("$item, ")
    }

    printArr(arrayOf("k", "t", "n"))  
    // k, t, n, 
//sampleEnd
}

Добавление и удаление элементов

Поскольку размер массивов фиксирован, они не поддерживают функции .add() и .remove(). Для выполнения этих операций необходимо создать новый массив. Для этого можно воспользоваться одним из следующих способов:

  • Используйте функцию .copyOf:

    fun main() {
    //sampleStart
        var arr = intArrayOf(0, 1, 2)
    
        arr = arr.copyOf(arr.size + 1)
        println(arr.joinToString())
        // 0, 1, 2, 0
    
        arr[arr.lastIndex] = 3
        println(arr.joinToString())
        // 0, 1, 2, 3
    //sampleEnd
    }
    
  • Используйте операторы + или +=:

    fun main() {
    //sampleStart
        var arr = intArrayOf(0, 1, 2)
    
        arr += 3
        println(arr.joinToString())
        // 0, 1, 2, 3
    
        arr = arr + intArrayOf(4, 5)
        println(arr.joinToString())
        // 0, 1, 2, 3, 4, 5
    //sampleEnd
    }
    

Если вам часто нужно добавлять или удалять элементы, используйте изменяемые коллекции.

Сравнение массивов

Чтобы проверить, содержат ли два массива одинаковые элементы в одном и том же порядке, используйте функции .contentEquals() и .contentDeepEquals():

fun main() {
//sampleStart
    val simpleArray = arrayOf(1, 2, 3)
    val anotherArray = arrayOf(1, 2, 3)

    // Compares contents of arrays
    println(simpleArray.contentEquals(anotherArray))
    // true

    // Using infix notation, compares contents of arrays after an element 
    // is changed
    simpleArray[0] = 10
    println(simpleArray contentEquals anotherArray)
    // false
//sampleEnd
}

Не используйте операторы равенства (==) и неравенства (!=) для сравнения содержимого массивов. Эти операторы проверяют, указывают ли присвоенные переменные на один и тот же объект.

Подробнее о том, почему массивы в Kotlin ведут себя именно так, читайте в нашей публикации в блоге.

Преобразование массивов

В Kotlin есть множество полезных функций для преобразования массивов. В этом разделе рассмотрены некоторые из них. Полный список см. в справочнике API.

Сумма

Чтобы получить сумму всех элементов массива, используйте функцию .sum():

fun main() {
//sampleStart
    val sumArray = arrayOf(1, 2, 3)
    println(sumArray.sum())
    // 6
//sampleEnd
}

Функцию .sum() можно использовать только с массивами числовых типов данных, например Int.

Сортировка и перемешивание

Элементы массива можно отсортировать в естественном порядке с помощью функции .sort() или случайным образом перемешать с помощью функции .shuffle():

fun main() {
//sampleStart
    val simpleArray = arrayOf(1, 2, 3)

    // Randomly shuffles elements
    simpleArray.shuffle()
    println(simpleArray.joinToString())
  
    // Sorts elements
    simpleArray.sort()
    println(simpleArray.joinToString())
    // 1, 2, 3
//sampleEnd
}

Чтобы получить новый отсортированный массив, не изменяя исходный, используйте функцию .sortedArray().

Передача функции переменного количества аргументов

В Kotlin функции можно передать переменное количество аргументов с помощью параметра vararg. Это полезно, когда заранее неизвестно число аргументов, например при форматировании сообщения или создании SQL-запроса.

Чтобы передать функции массив, содержащий переменное количество аргументов, используйте оператор развёртывания (*). Он передаёт каждый элемент массива выбранной функции как отдельный аргумент:

fun main() {
    val lettersArray = arrayOf("c", "d")
    printAllStrings("a", "b", *lettersArray)
    // abcd
}

fun printAllStrings(vararg strings: String) {
    for (string in strings) {
        print(string)
    }
}

Дополнительную информацию см. в разделе Переменное количество аргументов (varargs).

Преобразование в коллекции

При работе с разными API, одни из которых используют массивы, а другие — коллекции, можно преобразовывать массивы в коллекции и наоборот. Для этого используйте функции .toList(), .toSet() и .toMap(). Эти функции копируют содержимое массива в независимую копию. Последующие изменения массива в ней не отражаются.

Преобразование в List или Set

Чтобы преобразовать массив в List или Set, используйте функции .toList() и .toSet():

fun main() {
//sampleStart
    val simpleArray = arrayOf("a", "b", "c", "c")

    // Converts to a Set
    println(simpleArray.toSet())
    // [a, b, c]

    // Converts to a List
    println(simpleArray.toList())
    // [a, b, c, c]
//sampleEnd
}

Не используйте .asList() и связанные функции as*, если вы не уверены, что исходный массив не изменится и не используется совместно где-либо ещё. Эти функции создают обёртку вокруг исходного массива, а не копируют его. Поэтому изменения массива отражаются в списке, и наоборот.

fun main() {
//sampleStart
    val simpleArray = arrayOf("a", "b", "c")

    val list = simpleArray.asList()
    simpleArray[0] = "d"
    println(list)
    // [d, b, c]
//sampleEnd
}

Преобразование в Map

Чтобы преобразовать массив в Map, используйте функцию .toMap().

В Map можно преобразовать только массив из элементов типа Pair<K,V>. Первое значение экземпляра Pair становится ключом, а второе — значением. Если один и тот же ключ встречается несколько раз, используется последнее значение.

В этом примере для вызова функции .to используется инфиксная нотация, чтобы создать пары из Pair:

fun main() {
//sampleStart
    val pairArray = arrayOf("apple" to 120, "banana" to 150, "cherry" to 90, "apple" to 140)

    // Converts to a Map
    // Fruits are keys, calorie numbers are values
    // The latest "apple" value overwrites the first one
    println(pairArray.toMap())
    // {apple=140, banana=150, cherry=90}
//sampleEnd
}

Что дальше?

  • Узнайте, почему мы рекомендуем использовать коллекции в большинстве случаев, в обзоре «Обзор коллекций».

  • Узнайте о других базовых типах.

  • Если вы разработчик на Java, прочитайте наше руководство по миграции коллекций с Java на Kotlin.

30 июня 2026 г.
СтрокиПроверки типов и приведения

© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/arrays.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API