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

Kotlin中局部MutableList操作为何同步影响伴生对象变量?

Kotlin中引用类型与基本类型的行为差异问题

在Kotlin开发中遇到一个疑惑:调用局部列表mList的clear()方法时,Data类伴生对象中的MutableList变量list也被清空;但对double类型变量执行赋值修改操作时,局部变量的变更不会影响伴生对象中的对应变量。具体代码及输出如下:

  1. 伴生对象含MutableList的Data类:
class Data {
    companion object {
        var list:MutableList<String> = ArrayList()
    }
}
  1. 列表测试代码及输出:
fun main() {
   // 填充测试数据
   Data.list.add("Lion") 
   Data.list.add("Cat")
   Data.list.add("Dog")
   Data.list.add("Cheetah")

   // 局部列表mList
   val mList = Data.list

   println("Before Clearing : mList = $mList\n list = ${Data.list}")
   mList.clear()
   println("After Clearing : mList = $mList\n list = ${Data.list}")
}

输出:

Before Clearing : mList = [Lion, Cat, Dog, Cheetah]
 list = [Lion, Cat, Dog, Cheetah]
After Clearing : mList = []
 list = []
  1. Double类型变量测试:
    修改Data类伴生对象添加var pi = 3.14,测试代码:
var mPi = Data.pi
println("Before Assigning to New value mPi =  $mPi and pi = ${Data.pi}") 
mPi = 319.12
println("After Assigning to New value mPi =  $mPi and pi = ${Data.pi}") 

输出:

Before Assigning to New value mPi =  3.14 and pi = 3.14
After Assigning to New value mPi =  319.12 and pi = 3.14

请问为何会出现这种差异?


原因解释

1. 引用类型(MutableList)的行为

MutableList属于引用类型,执行val mList = Data.list时,并没有创建新的列表对象,只是把Data.list指向的内存地址赋值给了mList。也就是说,mList和Data.list是同一个列表对象的两个引用。

调用mList.clear()时,实际是通过这个引用操作了内存中的同一个列表对象,所以Data.list也会同步看到变更——因为它们指向的是同一个实体。

2. 基本类型(Double)的行为

Double属于基本数据类型(Kotlin中虽包装为对象,但底层处理遵循值类型逻辑),执行var mPi = Data.pi时,会把Data.pi的数值拷贝一份赋值给mPi。此时mPi和Data.pi是两个独立变量,各自持有独立的数值。

给mPi赋值新值时,只是修改了mPi自己持有的拷贝,不会影响Data.pi的原始数值。

总结

两种场景的核心差异在于:

  • 引用类型赋值传递的是对象的内存地址,多个引用指向同一个对象,修改对象内容会影响所有引用。
  • 基本类型赋值传递的是数值的拷贝,变量之间相互独立,修改其中一个不会影响另一个。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 04:15:37