android 为什么当我改变一个列表时,它也意外地改变了另一个列表

4smxwvx5  于 2023-06-04  发布在  Android
关注(0)|答案(4)|浏览(397)

你好,我想知道为什么我的程序只改变了editTransactionList,却改变了selectedDataEdited List?

var editTransactionList: MutableList<Transaction>? = mutableListOf()
var selectedDataEdited: List<Transaction>? = listOf()

editTransactionList = listTest as MutableList<Transaction>
selectedDataEdited = listTest

var position = 0

println("edit $editTransactionList")
println("select $selectedDataEdited")

editTransactionList.get(position).apply {
    amount = 2000
    name = "K"
}
println("edit $editTransactionList")
println("select $selectedDataEdited")

editTransactionList.get(position).apply {
    amount = 3000
    name = "Z"
}
println("edit $editTransactionList")
println("select $selectedDataEdited")

输出为

edit [Transaction(amount=1000, name=T, test=1)]
select [Transaction(amount=1000, name=T, test=1)]
edit [Transaction(amount=2000, name=K, test=1)]
select [Transaction(amount=2000, name=K, test=1)]
edit [Transaction(amount=3000, name=Z, test=1)]
select [Transaction(amount=3000, name=Z, test=1)]
pqwbnv8z

pqwbnv8z1#

变量基本上是引用。当你在变量中存储一个对象时,你实际上是说“当使用这个变量时,请引用这个对象”。因此,如果你将同一个对象“存储”到两个不同的变量中,它们中的每一个仍然引用同一个对象。使用第一个变量获取对象,对它进行更改,然后访问第二个变量,仍然会得到更改后的对象。
您需要复制列表以防止不必要的行为。但请记住,您可能需要一个深度副本。例如,简单地调用toList()只会产生一个浅拷贝,这意味着即使它将是一个不同的列表,其中的对象仍然会引用原始列表。
如果不知道Transaction是什么样子的话,很难判断什么是可行的。如果Transaction是一个数据类,那么selectedDataEdited = listTest.map { it.copy() }就可以工作。参见此示例https://pl.kotl.in/Q_o8pYXVs

9q78igpj

9q78igpj2#

如果selectedDataEdited = listTest.map { it.copy() }不工作,请尝试以下代码:

listedTest.forEach {
        selectedData.add(Transaction(amount = it.amount, name = it.name, test = it.test))
    }
sd2nnvve

sd2nnvve3#

为什么当我改变一个列表时,它也意外地改变了另一个列表
因为你没有“另一个”名单。你只有一个名单。
当执行selectedDataEdited = listTest时,将第二个引用分配给同一个列表。如果需要两个单独的列表,则必须创建它们,可能是通过克隆原始列表。

arknldoa

arknldoa4#

使用toMutableList代替as MutableList

editTransactionList = listTest.toMutableList()

它将复制你的列表,而不是传递对同一列表的引用。

相关问题