Kotlin Array的toList和asList有何不同?

时间:2018-01-23 21:50:16

标签: java arrays list reference kotlin

Kotlin Array课程提供asList()toList()toMutableList()方法。前两个方法都返回List,并在Kotlin reference中描述如下:

  • asList()返回包裹原始List的{​​{1}}。
  • Array会返回toList(),其中包含[原始List]的所有元素。

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

2 个答案:

答案 0 :(得分:35)

TL; DR

使用asList创建的列表会保留对原始 Array的引用。
使用toList / toMutableList创建的列表由原始Array副本支持。

说明

<强> asList

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

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

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

<强> toList

toList / toMutableList不是这种情况,因为数组是复制的

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

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

可以找到Kotlin源代码here

答案 1 :(得分:8)

基本上asList()仍然保留对原始Array的引用。这意味着该列表的突变也会改变基础Array

toList()只是将Array的值复制到新的List中,但之后没有延迟链接。

对于大多数用例,它们可能是可互换的。 asList()可能会有稍微好一点的性能(因为它没有执行副本),而toList()将是针对意外突变的“安全”副本。