Array<T>
é uma classe com implementação conhecida: é uma região seqüencial de memória de tamanho fixo que armazena os itens (e na JVM é representada pela matriz Java ).
List<T>
e MutableList<T>
são interfaces que têm diferentes implementações: ArrayList<T>
, LinkedList<T>
etc. representação de memória e operações de lógica de listas são definidos na implementação concreta, por exemplo, a indexação num LinkedList<T>
atravessa as ligações e leva tempo O (n), enquanto ArrayList<T>
lojas de seus itens em uma matriz alocada dinamicamente.
val list1: List<Int> = LinkedList<Int>()
val list2: List<Int> = ArrayList<Int>()
Array<T>
é mutável (pode ser alterado por qualquer referência a ele), mas List<T>
não possui métodos de modificação (é uma exibição somente leituraMutableList<T>
ou uma implementação de lista imutável ).
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
As matrizes têm tamanho fixo e não podem expandir ou reduzir a identidade de retenção (é necessário copiar uma matriz para redimensioná-la). Quanto às listas, MutableList<T>
tem add
e remove
funções, para que ele possa aumentar e reduzir seu tamanho.
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>
é invariável emT
( Array<Int>
não é Array<Number>
), o mesmo para MutableList<T>
, mas List<T>
é covariante ( List<Int>
é List<Number>
).
val a: Array<Number> = Array<Int>(0) { 0 } // won't compile
val l: List<Number> = listOf(1, 2, 3) // OK
As matrizes são optimizados para primitivas: existem separada IntArray
, DoubleArray
, CharArray
etc, que são mapeados para Java matrizes primitivas ( int[]
, double[]
, char[]
), não embalados uns ( Array<Int>
é mapeado para Java da Integer[]
). As listas em geral não têm implementações otimizadas para primitivas, embora algumas bibliotecas (fora do JDK) forneçam listas otimizadas por primitivas.
List<T>
e MutableList<T>
são tipos mapeados e têm comportamento especial na interoperabilidade Java (o Java List<T>
é visto no Kotlin como um List<T>
ou MutableList<T>
). As matrizes também são mapeadas, mas possuem outras regras de interoperabilidade Java.
Certos tipos de matriz são usados em anotações (matrizes primitivas Array<String>
, e matrizes com enum class
entradas), e há uma sintaxe literal de matriz especial para anotações . Listas e outras coleções não podem ser usadas em anotações.
Quanto ao uso, a boa prática é preferir usar listas em vez de matrizes em todos os lugares, exceto em partes críticas do desempenho do código, o raciocínio é o mesmo do Java .
Array
? Apenas são elementos - o mesmo noList
. O tamanho deList
também é fixo.val intArray = arrayOf(1,2,3); intArray[0] = 2
enquanto isso não acontecerával intList = listOf(1,2,3); intList[0] = 2
. O deList
fato tem um tamanho fixo, mas oMutableList
que o estende não é, portanto, é possível que umval a:List<Int>
relatório seja diferentesize
nas chamadas subseqüentes.List
ouArrayList
?List
(provavelmente 99% dos casos). Se você se preocupam com o uso de implementaçãoArrayList
ouLinkedList
ou qualquer outra aplicação concreta.