为了账号安全,请及时绑定邮箱和手机立即绑定

Kotlin中列表和数组类型之间的区别

Kotlin中列表和数组类型之间的区别

侃侃尔雅 2019-11-08 14:19:40
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)
查看完整描述

3 回答

?
慕妹3146593

TA贡献1820条经验 获得超9个赞

数组和列表(由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>not Array<Number>)上是不变的,与相同MutableList<T>,但是List<T>是协变(List<Int>is 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互操作性方面具有特殊行为(List<T>从Kotlin中将Java 视为List<T>或MutableList<T>)。数组也被映射,但是它们具有Java互操作性的其他规则。


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


至于用法,优良作法是在代码的性能关键部分以外的任何地方都使用列表而不是数组,其理由与Java相同。


查看完整回答
反对 回复 2019-11-08
?
慕村9548890

TA贡献1884条经验 获得超4个赞

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


此外,kotlin.collections.List还通过来实现一个接口java.util.ArrayList。kotlin.collections.MutableList当需要收集允许进行项目修改的集合时,也可以使用它。


在jvm级别Array上,由arrays表示。List另一方面,java.util.List由于Java中没有不可变的集合等效项,因此用表示。


查看完整回答
反对 回复 2019-11-08
?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

**一般,列表和数组类型之间的区别是:**


List<...>:

仅供阅读。


Array<...>:

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


查看完整回答
反对 回复 2019-11-08
  • 3 回答
  • 0 关注
  • 1621 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信