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

Kotlin列表添加元素时所有元素被覆盖为最新值问题求助

问题核心原因

你遇到的是典型的对象引用复用问题:

  1. 你整个代码流程中只调用了一次EachDay(day="", todo="")构造方法,全程只创建了1个EachDay实例
  2. Kotlin中类属于引用类型,向可变列表添加对象时,添加的是对象的内存引用,而非对象的深拷贝
  3. 你后续所有对eachDay.day、eachDay.todo的赋值,都是修改同一个内存地址里的属性值,三次add操作只是把同一个引用重复添加了三次
  4. 所以只要这个对象的属性被修改,列表里所有指向该地址的元素读取到的值都会同步更新,就出现了所有元素和最新值一致的现象
修复方案

方案1:每次添加前创建新的EachDay实例(最直接)

不要复用全局的eachDay变量,每次新增条目时单独构造实例:

data class EachDay(var day: String, var todo: String)

data class Week(val list:MutableList<EachDay>)

fun main() {
    val week:Week = Week(arrayListOf())

    // 每次新增都创建新实例
    week.list.add(EachDay(day="Saturday", todo="Shopping, Groceries"))
    println("Week$week")
    week.list.add(EachDay(day="Sunday", todo="Rest"))
    println("Week$week")
    week.list.add(EachDay(day="Monday", todo="Check emails, resume work"))
    println("Week$week")
}

方案2:使用data class的copy方法生成新实例(适合需要复用旧属性的场景)

如果你需要基于已有实例修改部分属性,可调用data class自带的copy方法生成全新实例:

val baseDay = EachDay(day="", todo="")
week.list.add(baseDay.copy(day="Saturday", todo="Shopping, Groceries"))
week.list.add(baseDay.copy(day="Sunday", todo="Rest"))

方案3:将EachDay属性改为不可变val(推荐,从设计上规避问题)

data class默认推荐使用不可变属性,修改属性时必须生成新实例,从语法层面避免误修改复用对象的问题:

// 属性用val声明,初始化后无法修改,必须创建新实例才能更新值
data class EachDay(val day: String, val todo: String)

内容的提问来源于stack exchange,提问作者Meenohara

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 09:15:03