Kotlin数组的toList和asList有何不同?
Kotlin Array
类提供了asList()
, toList()
和toMutableList()
方法。 前两种方法都返回一个List
,并在Kotlin参考文献中描述如下:
-
asList()
返回一个包装原始Array
的List
。 -
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()
将是一个“安全”的副本,用于防止意外的突变。