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

Dan*_*ári 139 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)
Run Code Online (Sandbox Code Playgroud)

hot*_*key 213

数组和列表(由其List<T>及其子类型表示MutableList<T>)有许多不同之处,以下是最重要的:

  • Array<T>是一个具有已知实现的类:它是一个存储项的顺序固定大小的内存区域(在JVM上,它由Java数组表示).

    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>()
    
    Run Code Online (Sandbox Code Playgroud)
  • 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
    
    Run Code Online (Sandbox Code Playgroud)
  • 数组具有固定大小,无法扩展或缩小保留标识(您需要复制数组以调整其大小).对于列表,MutableList<T>has 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
    
    Run Code Online (Sandbox Code Playgroud)
  • Array<T>不变的T(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
    
    Run Code Online (Sandbox Code Playgroud)
  • 阵列被用于原语优化:有分离IntArray,DoubleArray,CharArray等,它们被映射到Java原始阵列(int[],double[],char[]),不盒装那些(Array<Int>被映射到Java的Integer[]).列表一般没有针对基元优化的实现,尽管一些库(在JDK之外)提供基元优化列表.

  • List<T>并且MutableList<T>映射类型,并且在Java互操作性方面具有特殊行为(Java List<T>可以从Kotlin看作是List<T>或者MutableList<T>).数组也被映射,但它们具有Java互操作性的其他规则.

  • 某些数组类型用于注释(原始数组,Array<String>和带有enum class条目的数组),并且注释具有特殊的数组文字语法.列表和其他集合不能用于注释.

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


mie*_*sol 20

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

此外,还有kotlin.collections.List一个由其他人实现的接口java.util.ArrayList.它还扩展为kotlin.collections.MutableList在需要允许项目修改的集合时使用.

在jvm级别Array数组表示.List另一方面,java.util.List由于Java中没有可用的集合等价物,因此表示.

  • @AndroidEx 以下将编译 `val intArray = arrayOf(1,2,3); intArray[0] = 2`,而这不会`val intList = listOf(1,2,3); intList[0] = 2`. “List”确实具有固定大小,但扩展它的“MutableList”则没有,因此“val a:List&lt;Int&gt;”可能会在后续调用中报告不同的“大小”。 (7认同)
  • @IgorGanapolsky 如果您不关心具体实现,请使用“List”(可能是 99% 的情况)。如果您确实关心实现,请使用“ArrayList”或“LinkedList”或任何其他具体实现。 (2认同)

Sea*_*ean 14

除了上述之外,身份比较也不同:

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
Run Code Online (Sandbox Code Playgroud)

  • 这个答案帮助我理解了为什么带有数组的数据类建议您实现“equals”和“hashCode”函数,而在使用列表时则不要实现。 (4认同)