我已经创建了一个数据类并添加到列表中,如果我更改了项的值,同一项将在列表中多次添加,并且它将在添加到列表中的项中复制。
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)
}
2条答案
按热度按时间qkf9rpyu1#
当您将同一项目多次放入列表中时,对该项目的所有更改将在列表中的所有匹配项上可见,因为它始终指向同一项目。
变量
boy2
的声明不会产生另一个Boy
,而只是对同一个boy
的另一个引用。您可以使用数据类的复制功能生成对象的副本:
h9a6wy2h2#
这是预期行为。
需要注意的是,你只创建了
Boy
类的一个示例,因为你只调用了构造函数Boy(...)
一次,你也从来没有复制过它(你可以使用为Boy
类生成的copy(..)
方法来复制它,因为它是data class
)。所以整个程序实际上只有一个
Boy
,当你把这个示例赋值给变量,或者把它添加到列表中时,你只是设置了一个对同一个对象的引用,所以你在内存中有很多不同的地方“指向”同一个对象,如果你改变了这个对象的一个属性,那么任何引用这个对象的地方都会看到这个变化。