System.arraycopy不能直接操作二维数组整体结构,仅支持一维数组操作;行级搬运复制引用,行内搬运复制元素值,构造新数组需逐行搬运引用,拼接截取须按行循环处理。

System.arraycopy 不能直接操作二维数组的“整体结构”,它只认一维数组。所谓在二维数组矩阵中的应用,本质是把它当作“一维引用数组”来用——每一行是一个独立的一维数组对象,搬运行为发生在“行级”或“元素级”,必须明确区分“复制引用”和“复制内容”。
行级搬运:复制引用而非数据
二维数组 int[][] grid 实际是一个长度为 grid.length 的 int[] 引用数组。执行:
-
System.arraycopy(grid, i, grid, j, 1)—— 把第i行的引用赋给第j行位置,grid[j]现在指向和grid[i]相同的数组对象; - 这等价于
grid[j] = grid[i],不涉及元素拷贝,速度快但共享底层数据; - 适用于临时交换行、复用已有行对象等场景,但后续修改任一行会影响另一行。
行内元素搬运:真正复制数值
若要保留 grid[j] 自身的数组对象,仅把 grid[i] 的内容“填进去”,需确保两行长度一致,并调用:
-
System.arraycopy(grid[i], 0, grid[j], 0, grid[i].length); - 对
int、double等基本类型,这是安全的值拷贝; - 对对象类型(如
Person[]),只复制引用,grid[i][k]和grid[j][k]指向同一对象,后续修改会相互影响; - 需要深拷贝时,必须额外遍历并克隆每个元素。
构造新二维数组:组合多行引用
想从现有二维数组中提取若干行(比如第 0、2、4 行)组成新矩阵,可先声明目标引用数组,再逐行搬运引用:
int[][] subset = new int[3][];-
System.arraycopy(src, 0, subset, 0, 1);// 第 0 行 -
System.arraycopy(src, 2, subset, 1, 1);// 第 2 行 → subset[1] -
System.arraycopy(src, 4, subset, 2, 1);// 第 4 行 → subset[2] - 结果
subset的每行仍指向原数组对应行,未创建新元素数组。
拼接与截取:依赖一维视角处理
二维矩阵常需按列或按块处理,但 arraycopy 本身无“列”概念。可行做法:
- 若需横向拼接两矩阵(相同行数),逐行操作:
for (int r = 0; r ; - 若需截取子矩阵(如从第 1 行起取 2 行),先 new 出新引用数组,再用 arraycopy 搬运对应行引用;
- 所有操作都绕不开“行是一维数组”这一前提,没有捷径跳过手动控制维度。

















