← Назад к вопросам

В чем разница между IntArray и Array<Int>?

2.2 Middle🔥 131 комментариев
#Kotlin основы#Коллекции и структуры данных

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

IntArray vs Array<Int> в Kotlin

Это фундаментальное различие, которое влияет на производительность, память и типизацию. Давайте разберем подробно.

IntArray — примитивный массив

IntArray — это массив примитива int, который скомпилируется в обычный Java int[].

val numbers: IntArray = intArrayOf(1, 2, 3, 4, 5)
println(numbers[0])  // 1
println(numbers.size)  // 5

// Создание пустого массива размером 100
val emptyArray = IntArray(100)

// Заполнение значениями
val filledArray = IntArray(10) { index -> index * 2 }
// Результат: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

Array<Int> — массив объектов (boxed)

Array<Int> — это массив объектов типа Integer, каждый элемент — отдельный объект в памяти.

val numbers: Array<Int> = arrayOf(1, 2, 3, 4, 5)
println(numbers[0])  // 1
println(numbers.size)  // 5

// Создание пустого массива размером 100
val emptyArray = Array(100) { 0 }

// Или с nullable элементами
val nullableArray: Array<Int?> = arrayOfNulls(10)

Основные различия

1. Использование памяти:

// IntArray: экономный
val intArray = IntArray(1000)
// Занимает примерно 4KB (1000 * 4 bytes)

// Array<Int>: расточительный
val objectArray = Array(1000) { it }
// Занимает примерно 8KB объектов + овергед для каждого Integer
// Реальное потребление: 40KB+ (в зависимости от VM)

2. Производительность:

// IntArray: быстро, работает как обычный Java массив
for (i in 0 until intArray.size) {
    println(intArray[i])  // Прямой доступ к памяти
}

// Array<Int>: медленнее из-за распаковки (unboxing)
for (i in 0 until objectArray.size) {
    println(objectArray[i])  // Вызов Integer.intValue()
}

3. Null-безопасность:

// IntArray: НЕ может содержать null
val intArray: IntArray = intArrayOf(1, 2, 3)
// intArray[0] = null  // Compile error!

// Array<Int>: может содержать null (если не использовать non-null тип)
val nullable: Array<Int?> = arrayOfNulls(10)  // Все элементы null
val nonnull: Array<Int> = arrayOf(1, 2, 3)  // Не может быть null

4. Что происходит под капотом (Java компиляция):

// Kotlin
val intArray = IntArray(5)
val objectArray = Array(5) { 0 }

// Скомпилируется в Java примерно как:
// int[] intArray = new int[5];
// Integer[] objectArray = new Integer[5];
// objectArray[0] = 0;  // Autoboxing: int -> Integer

Практические примеры

Используй IntArray для:

// 1. Больших объемов чисел
fun processMillionNumbers() {
    val numbers = IntArray(1_000_000)
    // Экономим память и CPU
}

// 2. Числовых алгоритмов (сортировка, поиск)
fun quickSort(arr: IntArray, low: Int, high: Int) {
    // Максимальная производительность
}

// 3. Когда нет null значений
fun calculateSum(values: IntArray): Int {
    return values.sum()  // Работает прямо с примитивами
}

// 4. Native интеграция, JNI
external fun processNativeArray(arr: IntArray)

Используй Array<Int> для:

// 1. Когда нужны null значения
fun processOptionalNumbers(numbers: Array<Int?>): Int {
    return numbers.filterNotNull().sum()
}

// 2. Когда нужна гибкость типов (варианс)
fun printAny(array: Array<out Any>) {
    for (item in array) {
        println(item)
    }
}

// 3. Обобщенное программирование
fun <T> createArray(size: Int, default: T): Array<T> {
    return Array(size) { default }  // IntArray так не может
}

// 4. Когда работаешь с Collections Framework
fun toList(arr: Array<Int>): List<Int> {
    return arr.toList()
}

Все примитивные типы в Kotlin

// Примитивные массивы (экономные):
ByteArray      // byte[]
ShortArray     // short[]
IntArray       // int[]
LongArray      // long[]
FloatArray     // float[]
DoubleArray    // double[]
BooleanArray   // boolean[]
CharArray      // char[]

// Объектные массивы (boxed):
Array<Byte>
Array<Short>
Array<Int>
Array<Long>
Array<Float>
Array<Double>
Array<Boolean>
Array<Char>

Сравнение производительности

import kotlin.system.measureTimeMillis

fun main() {
    // IntArray: быстро
    val time1 = measureTimeMillis {
        val arr = IntArray(1_000_000) { it }
        var sum = 0
        for (i in arr) sum += i
    }
    println("IntArray: ${time1}ms")  // ~1ms
    
    // Array<Int>: медленнее
    val time2 = measureTimeMillis {
        val arr = Array(1_000_000) { it }
        var sum = 0
        for (i in arr) sum += i  // Unboxing каждый раз
    }
    println("Array<Int>: ${time2}ms")  // ~5-10ms
}

Правило простого выбора

  • IntArray — когда работаешь с числами в цикле/алгоритме
  • Array<Int> — когда нужна гибкость (generic, null, variance)
  • Сомневаешься? — начни с Array<Int>, потом оптимизируй если нужна скорость

Для большинства Android приложений разница незначительна, но в критичных местах (обработка больших данных, графика, математика) выбор типа массива важен.

В чем разница между IntArray и Array<Int>? | PrepBro