当断言到另一个变量时,可变数组会被覆盖

Mutable array get overridden when get asserted to another variable

我有一个简单的案例,我有 "List A" 和 5 个值,另一个 "List B" 作为 TempList 持有 "List 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?

当您创建一个对象并将对该对象的引用分配给 List_A 时,会为该对象分配一个内存并且它有一些地址,比如 @eae072eList_A 是对该对象的引用。当你创建一个变量List_B并赋值给它List_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

Does kotlin passes List_A variable Referance to List_B ?

没错。 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的类型可以推断出来,所以不需要明确指定类型。