List 和 Array 类型有什么区别?它似乎可以与它们进行相同的操作(循环,过滤器表达式等),行为或用法有什么不同吗?
List
Array
val names1 = listOf("Joe","Ben","Thomas") val names2 = arrayOf("Joe","Ben","Thomas") for (name in names1) println(name) for (name in names2) println(name)
Arrays和列表(由List<T>及其子类型MutableList<T>表示)有许多不同之处,以下是最重要的一些:
Array<T>
List<T> 和 MutableList<T> 是具有不同实现的接口: ArrayList<T> , LinkedList<T> 等 . 列表的存储器表示和操作逻辑在具体实现中定义,例如, LinkedList<T> 中的索引遍历链接并占用O(n)时间,而 ArrayList<T> 将其项目存储在动态分配的数组中 .
List<T>
MutableList<T>
ArrayList<T>
LinkedList<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
add
remove
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<Int>
Array<Number>
List<Int>
List<Number>
val a: Array<Number> = Array<Int>(0) { 0 } // won't compile val l: List<Number> = listOf(1, 2, 3) // OK
数组针对基元进行了优化:有单独的 IntArray , DoubleArray , CharArray 等,它们映射到Java原始数组( int[] , double[] , char[] ),而不是boxed( Array<Int> 映射到Java的 Integer[] ) . 列表一般没有针对基元优化的实现,尽管一些库(在JDK之外)提供基元优化列表 .
IntArray
DoubleArray
CharArray
int[]
double[]
char[]
Integer[]
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 . 列表和其他集合不能用于注释 .
Array<String>
enum class
至于用法,好的做法是更喜欢在数组中使用列表,除了代码的性能关键部分,其推理与that for Java相同 .
与使用方面的主要区别在于Arrays具有固定大小,而(Mutable)List可以动态调整其大小 . 此外 Array 是可变的,而 List 则不是 .
此外kotlin.collections.List是由 java.util.ArrayList 实现的接口 . 它还扩展了 kotlin.collections.MutableList ,以便在需要允许项目修改的集合时使用 .
java.util.ArrayList
kotlin.collections.MutableList
在jvm级别 Array 由arrays表示 . 另一方面, List 由java.util.List表示,因为Java中没有可用的集合等价物 .
2 回答
Arrays和列表(由List<T>及其子类型MutableList<T>表示)有许多不同之处,以下是最重要的一些:
Array<T>
是一个具有已知实现的类:它是一个存储项的顺序固定大小的内存区域(在JVM上它由Java array表示) .List<T>
和MutableList<T>
是具有不同实现的接口:ArrayList<T>
,LinkedList<T>
等 . 列表的存储器表示和操作逻辑在具体实现中定义,例如,LinkedList<T>
中的索引遍历链接并占用O(n)时间,而ArrayList<T>
将其项目存储在动态分配的数组中 .Array<T>
是可变的(可以通过对它的任何引用来更改),但List<T>
没有修改方法(它是read-only view of MutableList<T>或immutable list implementation) .MutableList<T>
具有add
和remove
函数,因此它可以增加和减小其大小 .Array<T>
是invariant on T(Array<Int>
不是Array<Number>
),MutableList<T>
相同,但List<T>
是协变的(List<Int>
是List<Number>
) .数组针对基元进行了优化:有单独的
IntArray
,DoubleArray
,CharArray
等,它们映射到Java原始数组(int[]
,double[]
,char[]
),而不是boxed(Array<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相同 .
与使用方面的主要区别在于Arrays具有固定大小,而(Mutable)List可以动态调整其大小 . 此外
Array
是可变的,而List
则不是 .此外kotlin.collections.List是由
java.util.ArrayList
实现的接口 . 它还扩展了kotlin.collections.MutableList
,以便在需要允许项目修改的集合时使用 .在jvm级别
Array
由arrays表示 . 另一方面,List
由java.util.List表示,因为Java中没有可用的集合等价物 .