当断言到另一个变量时,可变数组会被覆盖
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 时,会为该对象分配一个内存并且它有一些地址,比如 @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
Does kotlin passes List_A variable Referance to 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
中更改。
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
的类型可以推断出来,所以不需要明确指定类型。
我有一个简单的案例,我有 "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 时,会为该对象分配一个内存并且它有一些地址,比如 @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
Does kotlin passes List_A variable Referance to 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
中更改。
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
的类型可以推断出来,所以不需要明确指定类型。