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

Difference between List and Array types in Kotlin

ListArray类型有什么区别?似乎可以对它们进行相同的操作(循环、筛选表达式等),在行为或用法上有什么区别吗?

1
2
3
4
5
6
7
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及其子类型MutableList表示)有许多不同之处,其中最重要的是:

  • EDOCX1 11是一个已知实现的类:它是一个顺序固定大小的内存区域,存储项目(在JVM上用Java数组表示)。

    ListMutableList是具有不同实现的接口:ArrayListLinkedList等。列表的内存表示和操作逻辑是在具体实现中定义的,例如LinkedList中的索引通过链接并花费O(n)时间,而ArrayList将其项动态存储在分配的数组。

    1
    2
    val list1: List<Int> = LinkedList<Int>()
    val list2: List<Int> = ArrayList<Int>()
  • Array是可变的(可以通过对它的任何引用进行更改),但List没有修改方法(它不是MutableList的只读视图,也不是不可变的列表实现)。

    1
    2
    3
    4
    5
    6
    7
    8
    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具有addremove功能,可以增加和减少其大小。

    1
    2
    3
    4
    5
    6
    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
  • ArrayT上不变(Array不是Array,与MutableList相同,但List是协变的(ListList)。

    1
    2
    val a: Array<Number> = Array<Int>(0) { 0 } // won't compile
    val l: List<Number> = listOf(1, 2, 3) // OK

  • 数组为原语优化:有单独的EDOCX1,32,EDCOX1,33,EDCX1,34,等等,它们被映射到Java原始数组(EDCOX1,35,EDCOX1,36,EDCOX1,37),不是盒装的(EDCOX1,26)被映射到Java的EDCOX1 39)。列表通常没有为原语优化的实现,尽管一些库(JDK之外)提供了原语优化的列表。

  • EDOCX1·9和EDCOX1(10)是映射类型,在Java互操作性方面具有特殊的行为(Java的EDCOX1×9)是从Kotlin中看到的,要么是EDCOX1,9是EDCX1,要么是10)。还映射了数组,但它们具有Java互操作性的其他规则。

  • 某些数组类型用于注释(基元数组、Array和带有enum class项的数组),并且注释有一个特殊的数组文字语法。不能在批注中使用列表和其他集合。

  • 至于使用,好的做法是喜欢使用数组遍历数组,除了代码的性能关键部分,推理与Java相同。

  • 小精灵


    与使用端的主要区别在于数组的大小是固定的,而(Mutable)List可以动态地调整它们的大小。此外,Array是可变的,而List不是可变的。

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

    在JVM级别上,Array由数组表示。另一方面,EDCOX1〔2〕用EDCOX1〔8〕表示,因为在Java中没有不可变的集合等价物。


    **常规,列表类型和数组类型的区别是:**

    1
    List<...>:

    仅供阅读。

    1
    Array<...>:

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