可变数组在断言到另一个变量时被覆盖



我有一个简单的情况,我有 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时,将为该对象分配一个内存,并且它具有一些地址,例如@eae072eList_A 是对该对象的引用。当您创建变量List_BList_A分配给它时,它们都引用内存@eae072e中的相同地址。因此,当您使用其中一个来操作数据时,这种操作将反映在它们两个中 - List_AList_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_AList_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

listAlistB在您调用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的类型,因此无需明确指定类型。

相关内容

  • 没有找到相关文章

最新更新