首页 文章

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

提问于
浏览
80

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)

2 回答

  • 15

    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>()
    
    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>invariant on TArray<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[]double[]char[] ),而不是boxedArray<Int> 映射到Java的 Integer[] ) . 列表一般没有针对基元优化的实现,尽管一些库(在JDK之外)提供基元优化列表 .

    • List<T>MutableList<T>mapped types并且在Java互操作性方面有特殊行为(Java的 List<T> 在Kotlin中被视为 List<T>MutableList<T> ) . 数组也被映射,但它们具有Java互操作性 .

    • 某些数组类型用于annotations(原始数组, Array<String> 和带有 enum class 条目的数组),并且有一个特殊的array literal syntax for annotations . 列表和其他集合不能用于注释 .

    • 至于用法,好的做法是更喜欢在数组中使用列表,除了代码的性能关键部分,其推理与that for Java相同 .

  • 140

    与使用方面的主要区别在于Arrays具有固定大小,而(Mutable)List可以动态调整其大小 . 此外 Array 是可变的,而 List 则不是 .

    此外kotlin.collections.List是由 java.util.ArrayList 实现的接口 . 它还扩展了 kotlin.collections.MutableList ,以便在需要允许项目修改的集合时使用 .

    在jvm级别 Arrayarrays表示 . 另一方面, Listjava.util.List表示,因为Java中没有可用的集合等价物 .

相关问题