Как в список Котлин массива и asList разных?

Котлине Array класс asList(), toList() и toMutableList() методы. Первые два метода возвращают a List и описаны в ссылка Котлин следующим образом:

  • asList() возвращает List это обертывает оригинал Array.
  • toList() возвращает List содержащий все элементы [оригинал Array].

эти методы появляется заменимый. Как эти двое методы отличаются на практике?

2 ответов


TL; DR

список, созданный с помощью asList содержит ссылку на элемент оригинал Array.
Список, созданный с помощью toList/toMutableList стоит скопировать оригинал Array.

объяснение

asList

на asList функция создает список, в котором использует the то же самое Array экземпляр, что означает, что изменения исходного массива также оказывают влияние на List:

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

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

в список

это не относится к toList/toMutableList так как массив скопировал:

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

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

исходный код Kotlin можно найти здесь.


в принципе asList() по-прежнему сохраняет ссылку на оригинал Array. Это означает, что мутации в этом списке также мутируют базовый Array.

toList() просто копирует значения Array на новый List, но после этого нет никакой затяжной связи.

для большинства случаев использования они, вероятно, взаимозаменяемы. asList(), вероятно, будет иметь немного лучшую производительность (так как он не выполняет копию) и toList() будет" безопасной " копией против неожиданные мутации.