Изменяемый массив переопределяется при добавлении в другую переменную
У меня есть простой случай, когда у меня есть "Список A" с 5 значениями, а другой "Список B" действует как TempList, содержащий значения "Список A" теперь, когда я вызываю "list_A.clear ()"
"list_B" также очищается почему?
val List_A: MutableList<String> = ArrayList<String>()
List_A.add("index_1")
List_A.add("index_2")
List_A.add("index_3")
List_A.add("index_4")
List_A.add("index_5")
val List_B = List_A
List_A.clear()
Результат
List_A-----Size--------> 0
List_B-----Size--------> 0
Обратите внимание, что он работает, как и ожидалось, когда я определяю "List_B" как
var List_B: MutableList<String> = ArrayList<String>()
then
List_B.addAll(List_A)
Результат
List_A-----Size--------> 0
List_B-----Size--------> 5
Передает ли kotlin переменную List_A Referance в List_B?
3 ответа
Когда вы создаете объект и назначаете ссылку на этот объект для List_A, для этого объекта выделяется память, и у него есть некоторый адрес, скажем, @ eae072e. List_A является ссылкой на этот объект. Когда вы создаете переменную List_B и присваиваете ей List_A, они оба ссылаются на один и тот же адрес в памяти @ eae072e. Поэтому, когда вы используете один из них для манипулирования данными, эта манипуляция будет отражена в обоих из них - в List_A и List_B.
Чтобы избежать этого, должен быть создан новый экземпляр List_B:
var List_B: MutableList<String> = ArrayList<String>()
List_B.addAll(List_A)
И тогда вы можете очистить список List_A, и он не будет отражен в List_B:
List_A.clear()
// List_A is empty, List_B will contain items
listA
а также listB
оба держат одну и ту же ссылку во время вызова clear()
,
Что вам нужно сделать, это сделать копию listA
позвонив по телефону toMutableList()
,
val listA = ArrayList<String>()
listA.add("index_1")
listA.add("index_2")
// ...
val listB = listA.toMutableList()
listA.clear()
// listB will be unchangend
Замечания:
- Вы должны придерживаться соглашений об именах Kotlin, поэтому ваши переменные должны быть в верблюжьем регистре без подчеркивания.
- Тип
listA
можно сделать вывод, поэтому нет необходимости явно указывать тип.
Передает ли kotlin переменную List_A Referance в List_B?
Именно так. И то и другое List_A
а также List_B
обратитесь к тому же адресу в памяти. Если вы хотите сделать копию, вам нужно создать новый ArrayList
и добавить все элементы в него с addAll
, После этого вы можете очистить List_A
,
пример
val listA: MutableList<String> = mutableListOf("index_0", "index_1", "index_2")
val listB: MutableList<String> = mutableListOf()
listB.addAll(listA)
listA.clear()
Хотя это будет хорошо работать с String
в вашем случае вы должны понимать, что новый список содержит те же объекты (ссылки на те же объекты), а не их копию. Так что, если вы не очистите listA
и изменить его элемент, этот элемент также будет изменен в listB
соответственно.