Array<T>
це клас із відомою реалізацією: це послідовна область пам'яті фіксованого розміру, що зберігає елементи (а в JVM вона представлена масивом Java ).
List<T>
і MutableList<T>
це інтерфейси, що мають різні реалізації: ArrayList<T>
і LinkedList<T>
т.д. Логіка подання пам'яті та логіка операцій списків визначаються в конкретному виконанні, наприклад, індексація в LinkedList<T>
переході по посиланнях і займає O (n) час, ArrayList<T>
зберігаючи її елементи в динамічно розподіленому масиві.
val list1: List<Int> = LinkedList<Int>()
val list2: List<Int> = ArrayList<Int>()
Array<T>
є змінним (його можна змінити через будь-яку посилання на нього), але List<T>
не має методів модифікації (це або перегляд лише для читання,MutableList<T>
або реалізація незмінного списку ).
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
Масиви мають фіксований розмір і не можуть розширити або зменшити збереження ідентичності (вам потрібно скопіювати масив, щоб змінити його розмір). Що стосується списків, MutableList<T>
має add
та remove
функціонує, щоб він міг збільшувати та зменшувати свій розмір.
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>
є інваріантним наT
( Array<Int>
не Array<Number>
), те саме для MutableList<T>
, але List<T>
є коваріантним ( List<Int>
є List<Number>
).
val a: Array<Number> = Array<Int>(0) { 0 } // won't compile
val l: List<Number> = listOf(1, 2, 3) // OK
Масиви оптимізовані для примітивів: є окремі IntArray
, DoubleArray
, і CharArray
т.д. , які відображаються на Java примітивні масиви ( int[]
, double[]
, char[]
), а НЕ в штучної упаковці з них ( Array<Int>
відображається в Java Integer[]
). Загалом у списках немає реалізацій, оптимізованих для примітивів, хоча деякі бібліотеки (за межами JDK) містять списки, оптимізовані примітивом.
List<T>
і відображеніMutableList<T>
в типі і мають особливу поведінку в інтероперабельності Java (Java List<T>
розглядається з Котліна як List<T>
або MutableList<T>
). Масиви також відображені на карті, але вони мають інші правила сумісності Java.
Деякі типи масивів використовуються в анотаціях (примітивні масиви Array<String>
та масиви із enum class
записами), а для анотацій є спеціальний буквальний синтаксис масиву . Списки та інші колекції не можна використовувати в анотаціях.
Що стосується використання, хороша практика полягає в тому, щоб віддавати перевагу використанню списків над масивами скрізь, за винятком важливих для продуктивності частин вашого коду, міркування такі ж , як у Java .
Array
? Тільки це елементи - однакові вList
. РозмірList
також фіксований.