当声明另一个变量时,可变数组将被覆盖

时间:2019-01-12 12:43:16

标签: kotlin pass-by-reference mutablelist

我有一个简单的情况,我有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?

3 个答案:

答案 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_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中进行相应的更改。

答案 2 :(得分:2)

cy.routelistA在您调用listB时都具有相同的引用。

您需要做的是通过调用clear()来制作listA的副本。

toMutableList()

注意:

  • 您应该遵守Kotlin的命名约定,因此您的变量应为驼峰大小写形式,而不能使用下划线。
  • 可以推断val listA = ArrayList<String>() listA.add("index_1") listA.add("index_2") // ... val listB = listA.toMutableList() listA.clear() // listB will be unchangend 的类型,因此无需明确指定类型。