arrays.copyof对多维数组仅浅拷贝外层,新旧数组对象不同但内层数组引用相同;需逐行copyof实现伪深拷贝;真正深拷贝需递归或工具库支持。

Arrays.copyOf 不能递归复制多维数组的每一层,它只复制最外层数组的引用。对 int[][] 来说,新旧数组是两个不同的对象,但它们的每一行(即每个 int[])仍指向同一块内存。
copyOf 对多维数组的实际行为
当调用 Arrays.copyOf(original, original.length) 处理 int[][] 类型时:
- T 是 int[][],所以 copyOf 创建一个新的一维数组,用来装原来的那些 int[] 引用
- 原数组中每个 int[] 元素的地址被逐个复制过去,不是新建 int[]
- 因此 shallowCopy[0] == original[0] 返回 true,说明它们共享同一行数据
- 修改 shallowCopy[0][1] = 99,original[0][1] 也会变成 99
如何实现“外层独立、内层共用”的浅拷贝
这正是 copyOf 的默认行为,也是多数场景需要的轻量级隔离:
- 直接调用 int[][] copy = Arrays.copyOf(matrix, matrix.length)
- 无需额外处理,外层数组已分离,可安全替换某一行:如 copy[0] = new int[]{7, 8} 不影响原数组
- 适合配置缓存、临时视图、参数传递等不修改子数组内容的场景
若需每行都新建——手动逐行复制
当你要避免任何子数组共享(俗称“伪深拷贝”),就得自己控制内层数组:
- 创建新外层数组:int[][] rowCopy = new int[original.length][]
- 循环调用 copyOf 每一行:rowCopy[i] = Arrays.copyOf(original[i], original[i].length)
- 此时 rowCopy[0] == original[0] 为 false,但 rowCopy[0][0] == original[0][0] 仍为 true(基本类型值相等)
- 适用于需要独立修改某行内容,又不打算深克隆对象的中间态操作
真正深拷贝不在 copyOf 能力范围内
如果数组元素是自定义对象(如 Person[][]),且你希望连对象内部状态也完全隔离,copyOf 无能为力:
- 即使做了逐行 copyOf,Person 对象本身仍是同一实例
- 必须配合对象自身的 clone()、构造器重建、或序列化(如 SerializationUtils.clone())
- 多维数组 + 自定义对象 + 深拷贝 = 显式递归或依赖工具库,不可省略逻辑
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











