ChatGPT解决这个技术问题 Extra ChatGPT

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)

h
hotkey

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

Array 是一个具有已知实现的类:它是一个顺序的固定大小的内存区域,用于存储项目(在 JVM 上它由 Java 数组表示)。 List 和 MutableList 是具有不同实现的接口:ArrayList、LinkedList 等。列表的内存表示和操作逻辑在具体实现中定义,例如 LinkedList 中的索引通过链接并花费 O(n) 时间,而 ArrayList 将其项目存储在动态分配的数组中。 val list1: List = LinkedList() val list2: List = ArrayList()

Array 是可变的(可以通过对它的任何引用来更改它),但 List 没有修改方法(它是 MutableList 的只读视图或不可变列表实现)。 val a = arrayOf(1, 2, 3) a[0] = a[1] // OK val l = listOf(1, 2, 3) l[0] = l[1] // 不编译 val m = mutableListOf(1, 2, 3) m[0] = m[1] // OK

数组具有固定大小,不能扩展或缩小保留标识(您需要复制数组以调整其大小)。对于列表, MutableList 具有添加和删除功能,因此可以增加和减少其大小。 val a = arrayOf(1, 2, 3) println(a.size) // 对于这个数组,将始终为 3 val l = mutableListOf(1, 2, 3) l.add(4) println(l.size) / / 4

Array 在 T 上是不变的(Array 不是 Array),对于 MutableList 也是如此,但 List 是协变的(List 是 List)。 val a: Array = Array(0) { 0 } // 不会编译 val l: List = listOf(1, 2, 3) // OK

数组针对原语进行了优化:有单独的 IntArray、DoubleArray、CharArray 等映射到 Java 原始数组(int[]、double[]、char[]),而不是装箱的数组(Array 映射到 Java 的 Integer [])。列表通常没有针对原语优化的实现,尽管一些库(JDK 之外)提供了原语优化列表。

List 和 MutableList 是映射类型,在 Java 互操作性中具有特殊行为(Java 的 List 在 Kotlin 中被视为 List 或 MutableList)。数组也被映射,但它们具有 Java 互操作性的其他规则。

某些数组类型用于注解(原始数组、Array 和带有枚举类条目的数组),并且注解有特殊的数组字面量语法。列表和其他集合不能在注释中使用。

至于用法,好的做法是在任何地方都喜欢使用列表而不是数组,除了代码的性能关键部分,推理与 Java 相同。


Y
Yogesh Umesh Vaity

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

此外,kotlin.collections.List 是由 java.util.ArrayList 实现的接口。它还被 kotlin.collections.MutableList 扩展以在需要允许修改项目的集合时使用。

在 jvm 级别上,Arrayarrays 表示。另一方面,Listjava.util.List 表示,因为 Java 中没有可用的不可变集合等价物。


我在这里并不完全相信。 Array 中有什么是可变的?只有它的元素 - List 中的相同。 List 的大小也是固定的。
@AndroidEx 以下将编译 val intArray = arrayOf(1,2,3); intArray[0] = 2 而这不会 val intList = listOf(1,2,3); intList[0] = 2List 确实具有固定大小,但扩展它的 MutableList 没有,因此 val a:List<Int> 可能会在后续调用中报告不同的 size
建议使用 List 还是 ArrayList
@IgorGanapolsky 如果您不关心具体实现,请使用 List(可能是 99% 的情况🙂)。如果您确实关心实现,请使用 ArrayListLinkedList 或任何其他具体实现。
S
Sean

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

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