Kotlin中List和Arraytypes的区别
List
和Array
types有什么区别?
看起来可以对它们进行相同的操作(循环,过滤expression式等),在行为或用法方面是否有区别?
val names1 = listOf("Joe","Ben","Thomas") val names2 = arrayOf("Joe","Ben","Thomas") for (name in names1) println(name) for (name in names2) println(name)
数组和列表(由List<T>
及其子typesMutableList<T>
)有很多不同之处,这里最重要的是:
-
Array<T>
是一个具有已知实现的类:它是一个存储项目的顺序固定大小的内存区域(在JVM上它由Java数组表示)。List<T>
和MutableList<T>
是具有不同实现的接口:ArrayList<T>
,LinkedList<T>
等。列表的内存表示和操作逻辑在具体实现中定义,例如在LinkedList<T>
索引链接并需要O(n)时间,而ArrayList<T>
将其项存储在dynamic分配的数组中。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
function,以便增加和减小其大小。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
-
对于
MutableList<T>
,Array<T>
在T
(Array<Int>
不是Array<Number>
)上是不变的,但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
,IntArray
等映射到Java基本数组(int[]
,double[]
,char[]
),而不是装箱的(Array<Int>
映射到Java的Integer[]
)。 一般而言,列表没有针对基元进行优化的实现。 -
List<T>
和MutableList<T>
是映射types,并且在Java互操作性(Java的List<T>
被从Kotlin看作List<T>
或MutableList<T>
)中有特殊的行为。 数组也被映射,但是它们具有Java互操作性的其他规则 。 -
至于使用方法,最好的做法是更喜欢使用列表遍布数组,除了代码的性能关键部分,参数与Java的参数相同。
与使用方面的主要区别在于, 数组具有固定大小,而(Mutable)List
可以dynamic调整其大小。 而且, Array
是可变的,而List
不是。
而且, kotlin.collections.List
是一个由java.util.ArrayList
实现的接口。 它还通过kotlin.collections.MutableList
进行扩展,以便在需要修改项目的集合时使用。
在jvm级别Array
由数组表示。 另一方面, List
由java.util.List
表示,因为在Java中没有不变的集合等价物。