Ответ 1
Array<Int>
является целым Integer[]
под капотом, а IntArray
- int[]
. Это.
Это означает, что когда вы помещаете Int
в Array<Int>
, он всегда будет помещен в коробку (в частности, с Integer.valueOf()
). В случае с IntArray
никакого бокса не будет, потому что он переводится в примитивный массив Java.
Помимо возможных последствий для работы вышеизложенного, есть также удобство для рассмотрения. Примитивные массивы могут быть оставлены неинициализированными, и они будут иметь значения по умолчанию 0
во всех индексах. Вот почему IntArray
и остальные примитивные массивы имеют конструкторы, которые принимают только параметр размера:
val arr = IntArray(10)
println(arr.joinToString()) // 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Напротив, Array<T>
не имеет конструктора, который принимает только параметр размера: ему нужны действительные, не нулевые экземпляры T
во всех индексах, которые должны быть в правильном состоянии после создания. Для типов Number
это может быть значение по умолчанию 0
, но нет возможности создавать экземпляры по умолчанию для произвольного типа T
Поэтому при создании Array<Int>
вы можете использовать конструктор, который также выполняет функцию инициализации:
val arr = Array<Int>(10) { index -> 0 } // full, verbose syntax
val arr = Array(10) { 0 } // concise version
Или создайте Array<Int?>
Чтобы избежать необходимости инициализировать каждое значение, но затем вы будете вынуждены обрабатывать возможные значения null
каждый раз, когда вы читаете из массива.
val arr = arrayOfNulls<Int>(10)