108 votes

IntArray vs Array <Int> à Kotlin

Je ne suis pas sûr de ce que la différence entre un IntArray et Array<Int> est en Kotlin et pourquoi je ne peux pas utilisé de manière interchangeable:

missmatch

Je sais qu' IntArray se traduit par int[] lors du ciblage de l' JVM, mais qu'est - Array<Int> traduire?

En outre, vous pouvez également avoir d' String[] ou YourObject[]. Pourquoi Kotlin a des classes de type {primitive}Array quand à peu près tout peut être organisé dans un tableau, non seulement primitives.

140voto

zsmb13 Points 36441

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)

11voto

Eran Boudjnah Points 650

Il est à noter que l'utilisation de l'opérateur spread ( * ) sur un vararg donnera un IntArray . Si vous avez besoin d’un Array<Int> , vous pouvez convertir votre IntArray utilisant .toTypedArray() .

1voto

jamming Points 71

Les tableaux dans Kotlin sont des classes (pas de "spécial" des types comme Java).

Kotlin du stdlib offre spéciale fin des classes pour la JVM primitive des tableaux afin d'améliorer le langage Java d'intégration et de performance.

La règle d'or serait d'utiliser Array<T> , sauf si cela cause un problème lorsque l'on mélange avec du code Java existant, ou doit être appelée à partir des classes Java. Pour l'enregistrement, je n'ai jamais eu à utiliser IntArray.

Vous pouvez vérifier la Langue de la documentation à ce sujet, ici: https://kotlinlang.org/docs/reference/basic-types.html#arrays

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X