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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:39:45