Je ne sais pas quelle est la différence entre un IntArray
et un Array<Int>
dans Kotlin et pourquoi je ne peux pas les utiliser de manière interchangeable:
Je sais que cela se IntArray
traduit par le int[]
ciblage de JVM
, mais qu'est-ce que cela signifie Array<Int>
?
En outre, vous pouvez également avoir String[]
ou YourObject[]
. Pourquoi Kotlin a des classes du type {primitive}Array
quand à peu près tout peut être organisé dans un tableau, pas seulement les primitives.
Array<Int>
compile versInteger[]
(si le compilateur n'optimise pas cela)Réponses:
Array<Int>
est unInteger[]
sous le capot, tandis queIntArray
est unint[]
. C'est ça.Cela signifie que lorsque vous mettez un
Int
dans unArray<Int>
, il sera toujours encadré (spécifiquement, avec unInteger.valueOf()
appel). Dans le cas deIntArray
, aucune boxe ne se produira, car elle se traduit par un tableau primitif Java.Outre les implications possibles de ce qui précède sur les performances, il convient également de prendre en compte la commodité. Les tableaux primitifs peuvent être laissés non initialisés et ils auront des
0
valeurs par défaut à tous les index. C'est pourquoiIntArray
et le reste des tableaux primitifs ont des constructeurs qui ne prennent 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 de constructeur qui ne prend qu'un paramètre de taille: il a besoin d'T
instances valides non nulles à tous les index pour être dans un état valide après la création. Pour lesNumber
types, cela peut être une valeur par défaut0
, mais il n'y a aucun moyen de créer des instances par défaut d'un type arbitraireT
.Ainsi, lors de la création d'un
Array<Int>
, vous pouvez soit utiliser le constructeur qui prend également une fonction d'initialisation:val arr = Array<Int>(10) { index -> 0 } // full, verbose syntax val arr = Array(10) { 0 } // concise version
Ou créez un
Array<Int?>
pour éviter d'avoir à initialiser chaque valeur, mais vous serez ensuite obligé de gérer lesnull
valeurs possibles chaque fois que vous lirez dans le tableau.val arr = arrayOfNulls<Int>(10)
la source
int[]
estIntArray
,Integer[]
estArray<Int>
, et ainsi de suite, où est cette nouvelle classe mystérieuse? C'est la même chose, seule la syntaxe est différente.int[]
est aussi classe, d'ailleurs.Il est à noter que l'utilisation de l'
*
opérateur spread ( ) sur avararg
renverra un fichierIntArray
. Si vous avez besoin d'unArray<Int>
, vous pouvez convertir votreIntArray
utilisation.toTypedArray()
.la source
Les tableaux de Kotlin sont des classes (et non des types "spéciaux" comme Java).
Le stdlib de Kotlin fournit des classes à usage spécial pour les tableaux primitifs JVM afin d'améliorer l'intégration et les performances du langage Java.
La règle d'or serait à utiliser
Array<T>
sauf si cela pose un problème lors du mélange avec du code Java existant, ou doit être appelé à partir de classes Java. Pour mémoire, je n'ai jamais eu à m'en servirIntArray
.Vous pouvez consulter la documentation du langage à ce sujet ici: https://kotlinlang.org/docs/reference/basic-types.html#arrays
la source
Int
,Float
etc., étant donné que Kotlin ne dispose pas d' un type différent pourBoolean
ouboolean
. En termes de tableaux, je suppose que celaArray<Int>
serait différent deIntArray
. J'ai personnellement toujours utilisé ce dernier car cela ne m'a jamais dérangé, mais peut-être que Kotlin a une optimisation supplémentaire dont je ne suis pas au courant. Si vous programmez uniquement en kotlin, je ne vois aucun cas où vous avez besoin de l' un par rapport à l'autre, mais le tableau primitif peut toujours avoir ses avantages.