Answers:
数组和列表(由List<T>
和表示其子类型MutableList<T>
)有很多差异,这是最重要的:
Array<T>
是一个具有已知实现的类:它是一个顺序固定大小的内存区域,用于存储项目(在JVM上,它由Java array表示)。
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>
not Array<Number>
)上是不变的,与相同MutableList<T>
,但是List<T>
是协变(List<Int>
is 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互操作性方面具有特殊的行为(List<T>
从Kotlin中将Java 视为List<T>
或MutableList<T>
)。数组也被映射,但是它们具有Java互操作性的其他规则。
注释中使用了某些数组类型(原始数组Array<String>
和带有enum class
条目的数组),并且注释具有特殊的数组文字语法。列表和其他集合不能在注释中使用。
至于用法,优良作法是在代码的性能关键部分以外的任何地方都使用列表而不是数组,其理由与Java相同。
与使用方面的主要区别在于,数组具有固定的大小,同时(Mutable)List
可以动态调整其大小。而且Array
是可变的而List
不是可变的。
此外,kotlin.collections.List
还通过来实现一个接口java.util.ArrayList
。kotlin.collections.MutableList
当需要收集允许进行项目修改的集合时,也可以使用它进行扩展。
在jvm级别Array
上,由arrays表示。List
另一方面,java.util.List
由于Java中没有不可变的集合等效项,因此用表示。
val intArray = arrayOf(1,2,3); intArray[0] = 2
而不会编译val intList = listOf(1,2,3); intList[0] = 2
。该List
确实有一个固定的大小,但MutableList
它扩展它不会因此有可能的是,val a:List<Int>
将报告不同size
,在后续调用。
List
或ArrayList
?
List
(大约99%的案例)。如果您确实关心实现,请使用ArrayList
或LinkedList
其他任何具体实现。
Array
?只有它的元素-相同List
。的大小List
也是固定的。