Kotlin中List和Array类型之间的区别

时间:2016-03-28 12:27:52

标签: kotlin

ListArray类型之间有什么区别?
它似乎可以与它们进行相同的操作(循环,过滤器表达式等),行为或用法有什么不同吗?

val names1 = listOf("Joe","Ben","Thomas")
val names2 = arrayOf("Joe","Ben","Thomas")

for (name in names1)
    println(name)
for (name in names2)
    println(name)

4 个答案:

答案 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>具有addremove函数,因此可以增加和减少其大小。

    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
    
  • 为基元优化了数组:有单独的IntArrayDoubleArrayCharArray等,它们映射到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级别Arrayarrays表示。另一方面,Listjava.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<...>:

您可以修改它,或添加一些东西。