You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中MutableList添加对象后元素全部相等的原因咨询

问题原因分析:列表遍历后所有元素ID一致的本质

核心原因在于你定义的TestObject.InnerObject是用Kotlin的object关键字声明的——这是一个单例类,在整个应用的生命周期中只会存在唯一的一个实例。

代码执行过程拆解:

  1. val temp = TestObject.InnerObject这行代码并没有创建新对象,只是获取了这个单例的唯一实例引用。
  2. 第一个for循环中,每次temp.id = i都是在修改同一个实例的id属性,此时打印的是当前修改后的即时值,所以能正常输出0到15。
  3. 每次调用list.add(temp)时,都是把同一个实例的引用添加到列表中,也就是说你的列表里的16个“元素”其实全都是指向同一个对象的指针。
  4. 当第一个循环结束时,这个单例的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 21:48:31