List
和Array
类型之间有什么区别?
它似乎可以与它们进行相同的操作(循环,过滤器表达式等),行为或用法有什么不同吗?
val names1 = listOf("Joe","Ben","Thomas")
val names2 = arrayOf("Joe","Ben","Thomas")
for (name in names1)
println(name)
for (name in names2)
println(name)
答案 0 :(得分:180)
Arrays和列表(由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>
没有修改方法(它是read-only view of MutableList<T>
或者immutable list implementation invariant on 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>
boxed 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[]
,{{ 1}},double[]
),而非mapped types个(char[]
映射到Java Array<Int>
)。列表一般没有针对基元优化的实现,尽管一些库(在JDK之外)提供基元优化列表。
Integer[]
和List<T>
是other rules并且在Java互操作性方面有特殊行为(Java&#39; s MutableList<T>
从Kotlin看作{{1} }或List<T>
)。数组也被映射,但它们具有annotations的Java互操作性。
某些数组类型用于array literal syntax for annotations(原始数组,List<T>
和带有MutableList<T>
条目的数组),并且有一个特殊的that for Java 。列表和其他集合不能用于注释。
就使用情况而言,良好的做法是更喜欢在列表中使用列表,除了代码的性能关键部分,其推理与{{3}}相同。
答案 1 :(得分:16)
与使用方面的主要区别在于Arrays具有固定大小,而(Mutable)List
可以动态调整其大小。此外Array
是可变的,而List
则不是。
此外kotlin.collections.List
是由java.util.ArrayList
实现的接口。当需要允许修改项目的集合时,它还会被kotlin.collections.MutableList
扩展使用。
在jvm级别Array
由arrays表示。另一方面,List
由java.util.List
表示,因为Java中没有可用的集合等价物。
答案 2 :(得分:2)
除了上述内容之外,身份比较也有所不同:
val l1 = listOf("a")
val l2 = listOf("a")
var x = (l1 == l2) // => true
val a1 = arrayOf("a")
val a2 = arrayOf("a")
var y = (a1 == a2) // => false
答案 3 :(得分:-1)
** general,列表类型和数组类型之间的区别是:**
List<...>:
仅用于读取。
Array<...>:
您可以修改它,或添加一些东西。