Kotlin Array类提供asList(),toList()和toMutableList()方法.前两个方法都返回一个List,并在Kotlin reference中描述如下:
> asList()返回包装原始Array的List.
> toList()返回一个List,其中包含[原始Array]的所有元素.
这些方法似乎可以互换.这两种方法在实践中有何不同?
最佳答案
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
由于复制了数组,因此toList / toMutableList不是这种情况:
val arr = arrayOf(1, 2, 3)
val l2 = arr.toList()
arr[0] = 4
println(l2) // [1, 2, 3]
Kotlin源代码可以找到here.
kotlin Array和List互转
我们先来看一下java是怎么实现的:
List<String> a = new ArrayList<>();
a.add("aaa");
a.add("bbb");
a.add("ccc");
String[] b = a.toArray(new String[0]);
Array—>List:
List<String> c = Arrays.asList(b);
下面来看看kotlin是怎么实现的:
List —>Array:
val a = ArrayList<String>()
a.add("aaa")
a.add("bbb")
a.add("ccc")
val b = a.toTypedArray()
Array—>List:
val c = Arrays.asList(*b)
val c= b.asList()
val c= b.toList