Java Kotlin阵列';toList和asList有什么不同?

Java Kotlin阵列';toList和asList有什么不同?,java,arrays,list,reference,kotlin,Java,Arrays,List,Reference,Kotlin,KotlinArray类提供了asList()、toList()和toMutableList()方法。前两种方法都返回一个列表,在中描述如下: asList()返回一个包装原始数组的List toList()返回一个包含[原始数组]的所有元素的列表 这些方法似乎可以互换。这两种方法在实践中有什么不同;博士 使用asList创建的列表保留了对原始数组的引用 使用toList/toMutableList创建的列表由原始数组的副本支持 解释 asList asList函数创建一个列表,该列表重用相

Kotlin
Array
类提供了
asList()
toList()
toMutableList()
方法。前两种方法都返回一个
列表
,在中描述如下:

  • asList()
    返回一个包装原始
    数组的
    List
  • toList()
    返回一个包含[原始
    数组
    ]的所有元素的
    列表
这些方法似乎可以互换。这两种方法在实践中有什么不同;博士 使用
asList
创建的列表保留了对原始
数组的引用
使用
toList
/
toMutableList
创建的列表由原始
数组的副本支持

解释 asList

asList
函数创建一个列表,该列表重用相同的
数组
实例,这意味着对原始数组的更改也会影响
列表

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

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

toList
/
toMutableList
的情况并非如此,因为数组是复制的:

可以找到Kotlin源代码。

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

toList()
只是简单地将
数组的值复制到一个新的
列表中,但之后没有延迟链接

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

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

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