Array<Int>
est Integer[]
sous le capot, tandis que d' IntArray
est int[]
. C'est tout.
Cela signifie que quand vous mettez un Int
en Array<Int>
, il sera toujours en boîte (plus précisément, avec un Integer.valueOf()
appel). Dans le cas d' IntArray
, pas de boxe va se produire, car il se traduit par un primitif Java tableau.
Autres que les performances possibles implications de ce qui précède, il est également pratique à prendre en compte. Primitifs les tableaux peuvent être laissés non initialisée et ils auront par défaut 0
valeurs à tous les indices. C'est pourquoi, IntArray
et le reste de la primitive tableaux ont les constructeurs qui ne font qu'un paramètre de taille:
val arr = IntArray(10)
println(arr.joinToString()) // 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
En revanche, Array<T>
n'a pas un constructeur qui ne prend qu'un paramètre de taille: il a besoin d'valide, non nulles T
instances à tous les indices pour être dans un état valide après la création. Pour Number
types, ce qui pourrait être un défaut 0
, mais il n'y a aucun moyen de créer des instances par défaut d'un type arbitraire T
.
Donc, lors de la création d'un Array<Int>
, vous pouvez utiliser soit le constructeur qui prend un initialiseur de la fonction ainsi:
val arr = Array<Int>(10) { index -> 0 } // full, verbose syntax
val arr = Array(10) { 0 } // concise version
Ou de créer un Array<Int?>
pour éviter d'avoir à initialiser toutes les valeurs, mais ensuite vous serez par la suite contraint de faire face à d'éventuelles null
valeurs à chaque fois que vous lisez à partir de la matrice.
val arr = arrayOfNulls<Int>(10)