Kotlin中修改赋值得到的新MutableList,为何原列表也会被修改?
现象原因说明
这是JVM平台编程语言的通用特性:MutableList属于引用类型,变量存储的是堆内存中实际列表对象的地址,而非对象本身的完整拷贝。
- 你定义
list变量时,它指向堆中生成的ArrayList实例内存地址 - 执行
val newL = list赋值操作时,仅把list存储的内存地址复制给了newL,两个变量最终指向同一个列表实例 - 后续通过
newL调用remove、add方法修改的是同一个实例的内容,所以通过list访问时自然也会拿到修改后的结果
规避方案
如果需要修改新列表时不影响原列表,需要主动对原列表做拷贝,调用toMutableList()方法即可生成新的独立列表实例,修改示例如下:
val list: MutableList<String> = ArrayList() list.add("a") list.add("b") list.add("c") println(list) // 主动拷贝生成新实例,两个变量后续操作互不影响 val newL = list.toMutableList() val target = newL.find{it=="c"} newL.remove(target) newL.add("z") println(list) println(newL)
运行后输出:
[a, b, c] [a, b, c] [a, b, z]
内容的提问来源于stack exchange,提问作者Jamaldin Sabirjanov
相关产品推荐
相关产品推荐

