【问题标题】:Is List in Kotlin a LinkedList?Kotlin 中的 List 是 LinkedList 吗?
【发布时间】:2018-12-05 03:25:27
【问题描述】:

Java 中最受欢迎的列表是 ArrayListLinkedList

在 Kotlin 中,我看到了 ArrayListListList 实际上是 LinkedList 吗?例如

val list = listof("1st", "2nd")

【问题讨论】:

  • 不是很明显,继承自抽象列表而是实现。如果使用 intellij (tools -> Kotlin -> show byte code ) 可以看到 java 版本的 Kotlin 代码

标签: java arraylist linked-list kotlin


【解决方案1】:

如果你追踪源代码

Collections.kt

/**
 * Returns a new read-only list of given elements.  The returned list is serializable (JVM).
 * @sample samples.collections.Collections.Lists.readOnlyList
 */
public fun <T> listOf(vararg elements: T): List<T> = if (elements.size > 0) elements.asList() else emptyList()

然后 _Arrays.kt

/**
 * Returns a [List] that wraps the original array.
 */
public expect fun <T> Array<out T>.asList(): List<T>

然后你会发现它是 Kotlin 的 Array,被 Kotlin 的 List 接口包裹,我们称之为“Kotlin 的 Array List”

“Kotlin 的数组列表”可能与 Java 的数组相同,也可能不同——我猜它是在 Java (JVM) 或 Android 环境(Dalvik 或 ART)中

【讨论】:

    【解决方案2】:

    刚刚尝试打印类型,

    * 对于一个元素,它是一个 SingletonList

    val list = listOf("a")
    println(list.javaClass)
    

    输出:类 java.util.Collections$SingletonList

    * 对于多个元素,它是一个 ArrayList

    val list = listOf("a", "b", "c")
    println(list.javaClass)
    

    输出:类 java.util.Arrays$ArrayList

    【讨论】:

      【解决方案3】:

      kotlin 中的列表不是 LinkedList

      根据官方文档- Kotlin List 类型是 提供只读操作的接口,如 size、get 等。 就像在 Java 中一样,它从 Collection 继承,然后又继承 来自可迭代。

      listOf() 是标准 Kotlin 库中用于创建不可变列表的方法。 listOf() 方法是在 kotlin 中使用 数组列表 实现的。

      关注official document link了解更多详情。

      【讨论】:

      • 我认为重要的是要强调Arrays#ArrayList 不是通常所说的ArrayList (java.util.ArrayList)。它只是一个围绕数组的固定大小的包装器。这会为 add 等方法引发异常。
      • @Zabuza 你是对的,它会抛出异常,但官方文档说“目前,listOf 方法是使用数组列表实现的,但将来可以返回内存效率更高的完全不可变集合类型,利用他们知道自己无法改变的事实。”
      【解决方案4】:

      如果您使用listOf,您将获得某种List 实现,带有只读的List 接口,包含您作为参数提供的元素。通过使用这个函数,你暗示你不关心它是如何实现的。 实际上,如果您在 JVM 上,这可能仍然是 java.util.ArrayList 正如@Zabuza 在 cmets 中指出的,它实际上是由 Arrays.ArrayList 支持的,即一个稍微不同的类。

      如果你再次使用mutableListOf,你只是说你想要一些东西 包含你实现MutableList 的元素,但实现取决于标准库。同样,这目前由 ArrayList 支持,但这是一个实现细节。

      如果您确实需要,有几个函数可以显式返回更具体的类型。有arrayListOfsortedSetOflinkedMapOf,还有更多——碰巧没有linkedListOf,但如果你需要一个并且不想使用@,你可以自己实现它987654340@构造函数。

      更通用的listOfmutableListOf 是首选,如果您稍后将在平台之间共享代码 - 因为它们是标准库的一部分,它们可以在 JVM 上返回 ArrayList,但是如果您编译为 JavaScript 或 Native,则不同平台特定的实现。

      【讨论】:

        【解决方案5】:

        它既不是LinkedList 也不是ArrayList。基于source code

        public fun <T> listOf(element: T): List<T> = java.util.Collections.singletonList(element)
        

        或者,对于多个元素:

        public fun <T> listOf(vararg elements: T): List<T> = if (elements.size > 0) elements.asList() else emptyList()
        

        最后一段代码调用ArraysUtilJVM,后者又调用Arrays.asList(),后者返回一个Arrays.ArrayList实例。但是,这是一个实现细节,将来可能会改变。重要的是生成的对象实现了List 接口(即它是不可变的)。

        【讨论】:

        • ...这不是通常所说的ArrayList动态数组)。它是一个固定大小的数组包装器。
        猜你喜欢
        • 2013-04-10
        • 2013-01-26
        • 2020-12-14
        • 1970-01-01
        • 2010-11-04
        • 2011-01-24
        • 2011-08-17
        • 2021-12-19
        • 1970-01-01
        相关资源
        最近更新 更多