我有一个简单的情况,我有5个值的“列表A”,另一个“列表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变量引用传递给List_B?
答案 0 :(得分:2)
创建对象并将对该对象的引用分配给 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
答案 1 :(得分:2)
kotlin是否将List_A变量引用传递给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
中进行相应的更改。
答案 2 :(得分:2)
cy.route
和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
的类型,因此无需明确指定类型。