Kotlin中局部MutableList操作为何同步影响伴生对象变量?
Kotlin中引用类型与基本类型的行为差异问题
在Kotlin开发中遇到一个疑惑:调用局部列表mList的clear()方法时,Data类伴生对象中的MutableList变量list也被清空;但对double类型变量执行赋值修改操作时,局部变量的变更不会影响伴生对象中的对应变量。具体代码及输出如下:
- 伴生对象含MutableList的Data类:
class Data { companion object { var list:MutableList<String> = ArrayList() } }
- 列表测试代码及输出:
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 = []
- 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
相关产品推荐
相关产品推荐

