1

我有一个简单的案例,其中我有 5 个值的“列表 A”,另一个“列表 B”充当 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_A 变量引用传递给 List_B ?

4

3 回答 3

2

当您创建一个对象并将对该对象的引用分配给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
于 2019-01-12T12:51:42.783 回答
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相应地更改。

于 2019-01-12T13:09:31.417 回答
2

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

笔记:

  • 你应该坚持 Kotlin 的命名约定,所以你的变量应该是驼峰式的,没有下划线。
  • 的类型listA可以推断,因此无需明确指定类型。
于 2019-01-12T17:12:25.597 回答