Java 中最受欢迎的列表是ArrayList
和LinkedList
。
在 Kotlin 中,我看到了ArrayList
和List
.List
真的是LinkedList
吗?例如
val list = listof("1st", "2nd")
如果你使用listOf
,你会得到某种List
实现,带有只读List
接口,包含你作为参数提供的元素。通过使用这个函数,你暗示你不关心它是如何实现的。实际上,如果您在 JVM 上,这可能仍然是一个幕后正如@Zabuza在这里的评论中指出的那样,它实际上得到了一个java.util.ArrayList
。Arrays.ArrayList
的支持,这是一个略有不同的类。
如果你使用mutableListOf
,同样,你只是说你想要一些包含实现MutableList
的元素的东西,但实现取决于标准库。同样,这目前由一个ArrayList
支持,但这是一个实现细节。
有几个函数显式返回更具体的类型(如果需要的话(。有arrayListOf
、sortedSetOf
、linkedMapOf
,还有更多 - 没有linkedListOf
,但如果你需要一个并且不想使用LinkedList
构造函数,你可以自己实现它。
更通用的listOf
和mutableListOf
是可取的,如果有更改,稍后您将在平台之间共享代码 - 因为这些是标准库的一部分,它们可以在 JVM 上返回ArrayList
,但如果您编译为 JavaScript 或 Native,则返回不同的平台特定实现。
它既不是LinkedList
也不是ArrayList
。基于源代码:
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
接口(即,它是不可变的(。
刚刚尝试打印类型,
* 对于一个元素,它是一个单调列表
val list = listOf("a")
println(list.javaClass)
输出:类 java.util.Collections$SingletonList
* 对于多个元素,它是一个数组列表
val list = listOf("a", "b", "c")
println(list.javaClass)
输出: class java.util.Arrays$ArrayList
kotlin 中的列表不是 LinkedList
根据官方文档 - Kotlin 列表类型是一个 提供只读操作(如大小、获取等(的接口。 就像在Java中一样,它继承自Collection,而Collection又继承了 从可迭代。
listOf((是来自标准 Kotlin 库的用于创建不可变列表的方法。listOf((方法是使用 kotlin 中的数组列表实现的。
点击此官方文档链接了解更多详情。
如果跟踪源代码
收藏.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 的数组,被 Kotlin 的 List 接口包裹起来,我们称之为"Kotlin 的数组列表">
"Kotlin's Array List"可能与Java的数组相同,也可能不同 - 我猜它是在Java(JVM(或Android环境(Dalvik或ART(中。