Kotlin中List和Arraytypes的区别

ListArraytypes有什么区别?
看起来可以对它们进行相同的操作(循环,过滤expression式等),在行为或用法方面是否有区别?

 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<T>及其子typesMutableList<T> )有很多不同之处,这里最重要的是:

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

    List<T>MutableList<T>是具有不同实现的接口: ArrayList<T>LinkedList<T>等。列表的内存表示和操作逻辑在具体实现中定义,例如在LinkedList<T>索引链接并需要O(n)时间,而ArrayList<T>将其项存储在dynamic分配的数组中。

     val list1: List<Int> = LinkedList<Int>() val list2: List<Int> = ArrayList<Int>() 
  • 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 
  • 数组具有固定大小,不能扩展或缩小保留标识(您需要复制数组来调整其大小)。 至于列表, MutableList<T>具有addremovefunction,以便增加和减小其大小。

     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 
  • 对于MutableList<T>Array<T>TArray<Int>不是Array<Number> )上是不变的,但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 
  • 数组针对基元进行了优化:有独立的IntArrayDoubleArrayIntArray等映射到Java基本数组( int[]double[]char[] ),而不是装箱的( Array<Int>映射到Java的Integer[] )。 一般而言,列表没有针对基元进行优化的实现。

  • List<T>MutableList<T>是映射types,并且在Java互操作性(Java的List<T>被从Kotlin看作List<T>MutableList<T> )中有特殊的行为。 数组也被映射,但是它们具有Java互操作性的其他规则 。

  • 至于使用方法,最好的做法是更喜欢使用列表遍布数组,除了代码的性能关键部分,参数与Java的参数相同。

与使用方面的主要区别在于, 数组具有固定大小,而(Mutable)List可以dynamic调整其大小。 而且, Array是可变的,而List不是。

而且, kotlin.collections.List是一个由java.util.ArrayList实现的接口。 它还通过kotlin.collections.MutableList进行扩展,以便在需要修改项目的集合时使用。

在jvm级别Array由数组表示。 另一方面, Listjava.util.List表示,因为在Java中没有不变的集合等价物。