添加后编辑项目的Kotlin列表,更改将复制到添加的列表中

jhkqcmku  于 2023-01-05  发布在  Kotlin
关注(0)|答案(2)|浏览(113)

我已经创建了一个数据类并添加到列表中,如果我更改了项的值,同一项将在列表中多次添加,并且它将在添加到列表中的项中复制。

data class Boy(var name : String, var age : Int)

    fun main() {
        var boysList = arrayListOf<Boy>()
        var boysListFinal = arrayListOf<Boy>()
        val boy1 = Boy("test1234",1)
        boysList.add(boy1)
        for(boy in boysList){
            boysListFinal.add(boy)
            boysListFinal.add(boy)
            boysListFinal.add(boy)
            boy.name = "test1"
            boysListFinal.add(boy)
        }
        println(boysListFinal)
    }

产出

[Boy(name=test1, age=1), Boy(name=test1, age=1), Boy(name=test1, age=1), Boy(name=test1, age=1)]

预期产出

[Boy(name=test1234, age=1), Boy(name=test1234, age=1), Boy(name=test1234, age=1), Boy(name=test1, age=1)]

我已尝试将项目分配给对象,但仍无法获得预期输出

fun main() {
    var boysList = arrayListOf<Boy>()
    var boysListFinal = arrayListOf<Boy>()
    val boy1 = Boy("test1234",1)
    boysList.add(boy1)
    for(boy in boysList){
        boysListFinal.add(boy)
        boysListFinal.add(boy)
        boysListFinal.add(boy)        
        val boy2 = boy
        boy2.name = "test1"
        boysListFinal.add(boy2)
    }
    println(boysListFinal)
}
qkf9rpyu

qkf9rpyu1#

当您将同一项目多次放入列表中时,对该项目的所有更改将在列表中的所有匹配项上可见,因为它始终指向同一项目。
变量boy2的声明不会产生另一个Boy,而只是对同一个boy的另一个引用。
您可以使用数据类的复制功能生成对象的副本:

val boy2 = boy.copy(name = "test1")
boysListFinal.add(boy2)
h9a6wy2h

h9a6wy2h2#

这是预期行为。
需要注意的是,你只创建了Boy类的一个示例,因为你只调用了构造函数Boy(...)一次,你也从来没有复制过它(你可以使用为Boy类生成的copy(..)方法来复制它,因为它是data class)。
所以整个程序实际上只有一个Boy,当你把这个示例赋值给变量,或者把它添加到列表中时,你只是设置了一个对同一个对象的引用,所以你在内存中有很多不同的地方“指向”同一个对象,如果你改变了这个对象的一个属性,那么任何引用这个对象的地方都会看到这个变化。

相关问题