gpt4 book ai didi

arrays - Kotlin 中列表和数组类型的区别

转载 作者:IT老高 更新时间:2023-10-28 13:25:58 38 4
gpt4 key购买 nike

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)

最佳答案

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

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

    List<T>MutableList<T>是具有不同实现的接口(interface):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>没有修改方法(它是 read-only view of MutableList<T> immutable list implementation )。

    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>addremove函数,以便它可以增加和减少它的大小。

    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>invariant on 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[] ),而不是 boxed那些( Array<Int> 映射到 Java 的 Integer[] )。列表通常没有针对原语优化的实现,尽管一些库(JDK 之外)提供了原语优化列表。

  • List<T>MutableList<T>mapped types并且在 Java 互操作性方面具有特殊行为(Java 的 List<T> 在 Kotlin 中被视为 List<T>MutableList<T> )。数组也被映射,但它们有 other rules Java 互操作性。

  • annotations 中使用了某些数组类型(原始数组 Array<String> 和带有 enum class 条目的数组),还有一个特殊的 array literal syntax for annotations .列表和其他集合不能用于注释。

  • 关于用法,除了代码的性能关键部分外,最好在任何地方都使用列表而不是数组,原因与 that for Java 相同。 .

关于arrays - Kotlin 中列表和数组类型的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36262305/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com