Kotlin中MutableList添加对象后元素全部相等的原因咨询
问题原因分析:列表遍历后所有元素ID一致的本质
核心原因在于你定义的TestObject.InnerObject是用Kotlin的object关键字声明的——这是一个单例类,在整个应用的生命周期中只会存在唯一的一个实例。
代码执行过程拆解:
val temp = TestObject.InnerObject这行代码并没有创建新对象,只是获取了这个单例的唯一实例引用。- 第一个for循环中,每次
temp.id = i都是在修改同一个实例的id属性,此时打印的是当前修改后的即时值,所以能正常输出0到15。 - 每次调用
list.add(temp)时,都是把同一个实例的引用添加到列表中,也就是说你的列表里的16个“元素”其实全都是指向同一个对象的指针。 - 当第一个循环结束时,这个单例的id已经被最后一次循环(i=15)修改为15,所以第二个循环遍历列表时,所有元素本质都是这个单例,自然打印出的id全是15。
修正方案:
如果需要每个列表元素都是独立的对象,只需把InnerObject从单例(object)改成普通类(class):
object TestObject { class InnerObject { var id = 0 } }
然后在循环中每次创建新的实例:
val list = mutableListOf<TestObject.InnerObject>() for (i in 0..15) { val temp = TestObject.InnerObject().apply { id = i } Log.i("id", temp.id.toString()) list.add(temp) } for (element in list) { Log.i("id", element.id.toString()) }
这样每个循环都会生成一个独立的InnerObject实例,列表中每个元素都是不同的对象,遍历后就能输出0到15的正确结果。
内容的提问来源于stack exchange,提问作者CorenDA
相关产品推荐
相关产品推荐

