Kotlin Array的toList和asList有何不同?

M. *_*ich 17 java arrays reference list kotlin

该科特林Array类提供asList(),toList()toMutableList()方法.前两个方法都返回a List并在Kotlin引用中 描述如下:

  • asList()返回List包裹原始的Array.
  • toList()返回List包含[原始Array]的所有元素.

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

s1m*_*nw1 40

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]
Run Code Online (Sandbox Code Playgroud)

toList

这是不适合的情况下toList/ toMutableList因为该阵列被复制:

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

arr[0] = 4
println(l2) // [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

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


sam*_*ime 9

基本上asList()仍然保持对原始的引用Array.这意味着该列表的突变也会改变底层证券Array.

toList()只是简单地将值复制Array到一个新的List,但之后没有挥之不去的链接.

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