web-dev-qa-db-ja.com

Kotlin ArrayのtoListとasListはどう違うのですか?

Kotlin Arrayクラスは、asList()toList()、およびtoMutableList()メソッドを提供します。最初の2つのメソッドはどちらもListを返し、 Kotlinリファレンス で次のように説明されています。

  • asList()は、元のListをラップするArrayを返します。
  • toList()は、[元のList]のすべての要素を含むArrayを返します。

これらのメソッドappearは交換可能です。これら2つの方法の実際の違いは何ですか?

20
M. Palsich

TL; DR

asListで作成されたリストは、originalArrayへの参照を保持します。
toList/toMutableListを使用して作成されたリストは、元のArraycopyでサポートされています。

説明

asList

asList関数は、再利用sameArrayインスタンスを再利用するリストを作成します。これは、元の配列への変更が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のソースコードは here にあります。

39
s1m0nw1

基本的にasList()は、元のArrayへの参照を維持します。つまり、そのリストへの変更は、基になるArrayも変更します。

toList()は、Arrayの値を新しいListにコピーするだけですが、その後に残るリンクはありません。

ほとんどのユースケースでは、それらはおそらく交換可能です。 asList()はパフォーマンスがわずかに向上する可能性が高く(コピーを実行していないため)、toList()は予期しない変更に対して「安全な」コピーになります。

8
samanime