Kotlin数组的toList和asList有何不同?

Kotlin Array类提供了asList()toList()toMutableList()方法。 前两种方法都返回一个List ,并在Kotlin参考文献中描述如下:

  • asList()返回一个包装原始ArrayList
  • toList()返回包含[原始Array ]的所有元素的List

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

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源代码可以在这里find。

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

toList()只是将Array的值复制到一个新的List ,但是之后没有任何延续的链接。

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