Как в список Котлин массива и 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()
будет" безопасной " копией против неожиданные мутации.