[英]Difference between List and Array types in Kotlin
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)
数组和列表(由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>()
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>
具有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<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
阵列被用于原语优化:有单独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
条目的数组),并且annotations有一个特殊的数组文字语法。 不能在注释中使用列表和其他集合。
至于用法,好的做法是除了代码的性能关键部分外,更喜欢在任何地方使用列表而不是数组,推理与Java相同。
与使用方面的主要区别在于Arrays具有固定大小,而(Mutable)List
可以动态调整其大小。 此外Array
是可变的,而List
不是。
此外kotlin.collections.List
是一个由java.util.ArrayList
实现的接口。 它也由kotlin.collections.MutableList
扩展,以在需要允许项目修改的集合时使用。
在 jvm 级别, Array
由arrays表示。 另一方面, List
由java.util.List
表示,因为 Java 中没有可用的不可变集合等价物。
除了上述之外,身份比较也不同:
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
**一般来说,List和Array类型之间的不同之处是:**
List<...>:
仅供阅读。
Array<...>:
你可以修改它,或添加一些东西。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.