Kotlin Array 的 toList 和 asList 有何不同?

2022-09-01 10:25:24

Kotlin 类提供 、 和 方法。前两个方法都返回 a,并在 Kotlin 参考中进行了如下描述:ArrayasList()toList()toMutableList()List

  • asList()返回 包装原始 .ListArray
  • toList()返回 包含 [原始元素] 的所有元素的 。ListArray

这些方法似乎是可互换的。这两种方法在实践中有何不同?


答案 1

TL;DR

创建的列表保留对原始 .
使用 / 创建的列表由原始 .asListArraytoListtoMutableListArray

解释

作为列表

该函数创建一个重用一实例的列表,这意味着对原始数组的更改也会对 :asListArrayList

val arr = arrayOf(1, 2, 3)
val l1 = arr.asList()

arr[0] = 4
println(l1) // [4, 2, 3]

到列表

对于 /则情况并非如此,因为数组是复制的toListtoMutableList

val arr = arrayOf(1, 2, 3)
val l2 = arr.toList()

arr[0] = 4
println(l2) // [1, 2, 3]

Kotlin 源代码可以在这里找到。


答案 2

基本上仍然保持对原始的引用。这意味着该列表的突变也会使底层发生突变。asList()ArrayArray

toList()只是简单地将 的值复制到一个新的,但之后没有徘徊的链接。ArrayList

对于大多数用例,它们可能是可互换的。 可能会具有稍好的性能(因为它不执行复制),并且将是针对意外突变的“安全”副本。asList()toList()