Kotlin二维数组值传递问题:修改第二个数组时第一个同步变化,clone/copyOf无效
解决Kotlin二维数组赋值后引用关联的问题
嘿,我完全懂你遇到的困扰——这其实是Kotlin里引用类型浅拷贝的典型问题!咱们先拆解下原因,再给你搞定的方案。
为什么直接赋值/浅拷贝没用?
你代码里的tableF = table!!只是把原数组的引用赋值给了tableF,两个变量指向的是内存里同一个二维数组。哪怕你用了clone()或者copyOf(),这俩方法对于二维数组来说也只是做了浅拷贝:它们只会复制外层数组的结构,但里面的每个子数组(也就是Array<Int>)还是指向原数组的子数组引用。所以你修改tableF里的元素时,本质上还是在修改原table的内存数据。
正确的解决方案:深拷贝二维数组
要让tableF成为完全独立的数组,你需要对二维数组做深拷贝——也就是不仅拷贝外层数组,还要逐个拷贝里面的每个子数组。这里有两种简单的实现方式:
方式1:用map+copyOf快速实现
tableF = table!!.map { row -> row.copyOf() }.toTypedArray()
map会遍历原数组的每一行(子数组),用copyOf()创建该行的独立副本,最后再转成Array类型,这样整个二维数组就和原数组彻底断开关联了。
方式2:嵌套循环手动拷贝
如果你更习惯显式循环,也可以这么写:
val n = table!!.size tableF = Array(n) { i -> Array(n) { j -> table!![i][j] } }
这种方式逐个复制每个元素,同样能生成完全独立的二维数组。
修改后的完整代码示例
把你的factorization()函数改成下面这样就没问题了:
object MatrixObject { var table: Array<Array<Int>>? = null fun randOf(n: Int) { table = Array(n) { Array(n) { Random().nextInt(100) } } } var tableF: Array<Array<Int>>? = null get() { if (field == null) factorization() return field } fun factorization() { // 替换原赋值语句为深拷贝 tableF = table!!.map { it.copyOf() }.toTypedArray() // 现在修改tableF的元素,table不会受影响了 // 比如测试修改: tableF!![0][0] = 999 } }
现在你再修改tableF里的元素,原table就不会跟着变啦!
内容的提问来源于stack exchange,提问作者Alex Kopylov
相关产品推荐
相关产品推荐

