Array<T>
est une classe avec une implémentation connue: c'est une région mémoire séquentielle de taille fixe stockant les éléments (et sur JVM, elle est représentée par un tableau Java ).
List<T>
et MutableList<T>
sont des interfaces qui ont différentes implémentations: ArrayList<T>
, LinkedList<T>
etc. logique de représentation de la mémoire et le fonctionnement des listes sont définies dans la mise en œuvre concrète, par exemple , l' indexation dans un LinkedList<T>
passe par les liens et prend O (n) tandis que ArrayList<T>
stocke ses éléments dans un tableau alloué dynamiquement.
val list1: List<Int> = LinkedList<Int>()
val list2: List<Int> = ArrayList<Int>()
Array<T>
est modifiable (il peut être modifié via n'importe quelle référence), mais List<T>
n'a pas de méthodes de modification (il s'agit d'une vue en lecture seuleMutableList<T>
ou d'une implémentation de liste immuable ).
val a = arrayOf(1, 2, 3)
a[0] = a[1] // OK
val l = listOf(1, 2, 3)
l[0] = l[1] // doesn't compile
val m = mutableListOf(1, 2, 3)
m[0] = m[1] // OK
Les tableaux ont une taille fixe et ne peuvent pas étendre ou réduire en conservant l'identité (vous devez copier un tableau pour le redimensionner). Quant aux listes, MutableList<T>
a add
et remove
fonctions, afin qu'il puisse augmenter et réduire sa taille.
val a = arrayOf(1, 2, 3)
println(a.size) // will always be 3 for this array
val l = mutableListOf(1, 2, 3)
l.add(4)
println(l.size) // 4
Array<T>
est invariant surT
( Array<Int>
n'est pas Array<Number>
), pareil pour MutableList<T>
, mais List<T>
est covariant ( List<Int>
est List<Number>
).
val a: Array<Number> = Array<Int>(0) { 0 } // won't compile
val l: List<Number> = listOf(1, 2, 3) // OK
Les tableaux sont optimisés pour les primitives: il sont séparés IntArray
, DoubleArray
, CharArray
etc. , qui sont mis en correspondance avec les tableaux Java primitives ( int[]
, double[]
, char[]
), pas boxed les ( Array<Int>
est mis en correspondance de Java Integer[]
). Les listes en général n'ont pas d'implémentations optimisées pour les primitives, bien que certaines bibliothèques (en dehors de JDK) fournissent des listes optimisées pour les primitives.
List<T>
et MutableList<T>
sont des types mappés et ont un comportement spécial dans l'interopérabilité Java (Java List<T>
est vu de Kotlin comme l'un List<T>
ou l' autre MutableList<T>
). Les tableaux sont également mappés, mais ils ont d' autres règles d'interopérabilité Java.
Certains types de tableaux sont utilisés dans les annotations (tableaux primitifs Array<String>
et tableaux avec enum class
entrées), et il existe une syntaxe littérale de tableau spéciale pour les annotations . Les listes et autres collections ne peuvent pas être utilisées dans les annotations.
En ce qui concerne l'utilisation, la bonne pratique est de préférer utiliser des listes sur des tableaux partout, sauf pour les parties critiques de performances de votre code, le raisonnement est le même que pour Java .
Array
? Seuls ses éléments - le même dans leList
. La taille deList
est également fixe.val intArray = arrayOf(1,2,3); intArray[0] = 2
alors que ce ne sera pas le casval intList = listOf(1,2,3); intList[0] = 2
. Le a enList
effet une taille fixe maisMutableList
qui ne l'étend pas, il est donc possible que unval a:List<Int>
rapportera différentsize
lors des appels suivants.List
ouArrayList
?List
(probablement 99% des cas 🙂). Si vous faites attention sur l' utilisation de la mise en œuvreArrayList
ouLinkedList
ou toute autre mise en œuvre du béton.