-2

我想问的问题是关于 kotlin 中的编程相关问题。这个问题可能看起来很糟糕,但我想不出如何处理这种情况。

val array = ArrayList<ArrayList<Int>>()

val subAnswer = ArrayList<Int>()
subAnswer.add(1)
subAnswer.add(2)
subAnswer.add(3)

array.add(subAnswer)
subAnswer.clear()

如果我打印出数组,它是空的。我期望的行为是 subAnswer 被清除但数组将包含 [[1,2,3]] 我想知道为什么。它不应该包含 [[1,2,3]] 吗?为什么清除 subAnswer 也会清除数组?以及如何解决?

我认为一个对象被复制并添加到数组中,因此添加到数组和 subAnswer 的对象不共享相同的内存地址。在这种情况下,似乎添加的对象只是 subAnswer 的引用,因此清除 subAnswer 也会影响数组。

如果我想获得预期的行为,我该怎么做?如果有关于这个问题的任何编程概念相关的博客,请告诉我。谢谢你。

4

1 回答 1

1

首先,您将 subAnswer 中包含的数组的引用添加到变量数组,然后清除该引用中的值。

由于它们在堆中是相同的引用,因此从一个变量更改它会改变它。

要保留列表,您可以复制它,

array.add(ArrayList(subAnswer)) // <- creates a new ArrayList with elements from subAnswer
subAnswer.clear()

PS:在 Kotlin 中不推荐直接使用 ArrayList 样式,应该使用 MutableList 代替。

val list = mutableListOf<List<Int>>() // or use MutableList instead if you like too use

val subAnswer = mutableListOf<Int>()
subAnswer.add(1)
subAnswer.add(2)
subAnswer.add(3)

list.add(subAnswer.toList()) // copies and create new list, or use toMutableList to create a mutable list
subAnswer.clear()
于 2020-05-05T15:18:29.597 回答