Array<Int>
é um Integer[]
sob o capô, enquanto IntArray
é um int[]
. É isso aí.
Isso significa que quando você coloca um Int
em um Array<Int>
, ele sempre será encaixotado (especificamente, com uma Integer.valueOf()
chamada). No caso de IntArray
, nenhum boxing ocorrerá, porque se traduz em um array primitivo Java.
Além das possíveis implicações de desempenho acima, também há conveniência a ser considerada. Matrizes primitivas podem não ser inicializadas e terão 0
valores padrão em todos os índices. É por isso que IntArray
e o resto das matrizes primitivas têm construtores que aceitam apenas um parâmetro de tamanho:
val arr = IntArray(10)
println(arr.joinToString())
Em contraste, Array<T>
não tem um construtor que leva apenas um parâmetro de tamanho: ele precisa de T
instâncias válidas e não nulas em todos os índices para estar em um estado válido após a criação. Para Number
tipos, pode ser um padrão 0
, mas não há como criar instâncias padrão de um tipo arbitrário T
.
Portanto, ao criar um Array<Int>
, você pode usar o construtor que também recebe uma função de inicializador:
val arr = Array<Int>(10) { index -> 0 }
val arr = Array(10) { 0 }
Ou crie um Array<Int?>
para evitar ter que inicializar todos os valores, mas depois você será forçado a lidar com os null
valores possíveis toda vez que ler o array.
val arr = arrayOfNulls<Int>(10)
Array<Int>
compila paraInteger[]
(se o compilador não otimizar isso)