Копирование коллекций

Копирование коллекций

Kotlin объектно-ориентированный язык программирования и все экземпляры в случае присвоение к другим объектам присваиваются по ссылке, это также касается и коллекций. Если создать одну коллекцию и затем эту коллекцию присвоить другой коллекции они ссылаются на одну и ту же область памяти и в случае изменения одной коллекции значения другой коллекции также меняются:

// Создаём первую коллекцию
val sourceList = mutableListOf(1, 2, 3)
// Создаём вторую коллекцию и присваиваем ей первую
val referenceList = sourceList 
println(sourceList) // [1, 2, 3]
println(referenceList) // [1, 2, 3]
referenceList.add(4) // Добавляем элемент второй коллекции
sourceList.add(5) // Добавляем элемент в первую коллекцию
// В результате теперь обе коллекции ссылаются на одну и ту же область памяти в которой хранится 5 значений
println(sourceList) // [1, 2, 3, 4, 5]
println(referenceList) // [1, 2, 3, 4, 5]

Если необходима полноценная копия коллекции можно воспользоваться функцией toMutableList(), toList(), toSet() и другими функциями, которые копируют элементы коллекции имеющиеся непосредственно во время вызова и возвращают ссылку на новую коллекцию:

val sourceList = mutableListOf(1, 2, 3)
// toMutableList создаёт независимую копию коллекции в новой области памяти и возвращает её, которая и присваивается переменной referenceList
val referenceList = sourceList.toMutableList()
println(sourceList) // [1, 2, 3]
println(referenceList) // [1, 2, 3]
// Добавляем значение 4 в конец второй коллекции
referenceList.add(4)
// Добавляем значение 5 в конец первой коллекции
sourceList.add(5)
// В результате теперь обе коллекции ссылаются на две разные области памяти
println(sourceList) // [1, 2, 3, 5]
println(referenceList) // [1, 2, 3, 4]

Также вышеуказанные функции могут быть использованы для конвертации коллекции одного типа в другую:

val sourceList = mutableListOf(1, 2, 3)
var set : Set<Int> = sourceList.toSet()