为什么Kotlin嵌套列表有这种行为

时间:2018-12-31 09:15:46

标签: kotlin

看看这个代码示例

val list = mutableListOf("1", "2", "3")

val listOfLists = mutableListOf(list, list, list)

val firstList = listOfLists[0]     //get reference to *list* variable

firstList[0] = "Hello"            // replace "1" in firstList with "Hello"

print(listOfLists)

这是打印输出

[[Hello, 2, 3], [Hello, 2, 3], [Hello, 2, 3]]

如果您发现从未再次调用listOfLists变量,但该变量没有被更新。而且更新不仅在第一个位置,而且还在所有位置更新。

我的意图只是单独更新firstList变量。

为什么会发生这种情况,我该如何解决?

3 个答案:

答案 0 :(得分:4)

它是OOP的对象行为人。它会影响所有引用...

enter image description here

答案 1 :(得分:2)

Java 将变量作为引用处理,因此也将 Kotlin 用作引用。因此,所有引用在更新一个后都会更改。您必须使用列表的副本来确保这些副本独立更新:

val list = listOf("1", "2", "3")
val listOfLists = mutableListOf(
            list.toMutableList(),
            list.toMutableList(),
            list.toMutableList())

val firstList = listOfLists[0]
firstList[0] = "Hello"
print(listOfLists)

答案 2 :(得分:2)

问题

您要在另一个列表中放置三个引用到同一列表。通过这些引用之一更改列表将更改所有引用指向的数据。

解决方案

如果您不想创建<a class="tile checklogin" href="javascript:void(0);" data-toggle="modal" refcon="hotels/bkhtl/1" data-target="#login"> <a class="tile checklogin" href="javascript:void(0);" data-toggle="modal" refcon="hotels/bkhtl/2" data-target="#login"> <a class="tile checklogin" href="javascript:void(0);" data-toggle="modal" refcon="hotels/bkhtl/3" data-target="#login"> 的三个独立副本,例如使用扩展功能toMutableList()

list

输出:

  

[[Hello,2,3],[1、2、3],[1、2、3]]