我有一个简单的情况,我有 5 个值的"列表 A",另一个"列表 B"充当保存"列表 A"值的 TempList现在当我调用"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_B List_A?
当您创建一个对象并将对该对象的引用分配给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
Kotlin 是否将变量引用传递给List_B List_A?
完全。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
。
listA
和listB
在您调用clear()
时都持有相同的引用。
您需要做的是通过调用toMutableList()
来复制listA
。
val listA = ArrayList<String>()
listA.add("index_1")
listA.add("index_2")
// ...
val listB = listA.toMutableList()
listA.clear()
// listB will be unchangend
注意:
- 你应该坚持 Kotlin 的命名约定,所以你的变量应该在驼峰大小写中,没有下划线。
- 可以推断
listA
的类型,因此无需明确指定类型。