system.arraycopy对二维数组只能实现浅拷贝,因其仅复制外层数组中指向子数组的引用,不复制子数组内容;深拷贝需先创建新外层数组,再逐行分配新子数组并用arraycopy复制元素。

System.arraycopy 不能直接实现二维数组的深拷贝,它只能完成浅拷贝——即只复制数组引用,不递归复制元素对象。对二维数组而言,外层数组被复制,但每个子数组(即一维数组)仍指向原对象,修改子数组内容会影响原数组。
为什么 arraycopy 对二维数组是浅拷贝
Java 中二维数组本质是“数组的数组”:类型为 int[][] 的变量实际存储的是指向一维数组对象的引用数组。System.arraycopy 复制的是这些引用,而非引用所指向的一维数组本身。
例如:
int[][] src = {{1, 2}, {3, 4}};
int[][] dst = new int[2][];
System.arraycopy(src, 0, dst, 0, src.length); // 复制两个引用
dst[0][0] = 99; // 修改 dst[0] 的元素 → src[0][0] 也变成 99
用 arraycopy 实现真正深拷贝的关键步骤
需分两层操作:先复制外层数组,再逐个复制每个子数组。
从 AI 编程会话日志(Clawdbot、Claude Code、Codex)中提取对话记录。该功能用于在用户要求导出提示词历史、会话日志或 `.jsonl` 格式的会话文件时使用。
- 分配新外层数组:
int[][] dst = new int[src.length][]; - 遍历 src 每一行,为 dst 对应行分配新一维数组:
dst[i] = new int[src[i].length]; - 对每一行调用 System.arraycopy 复制元素:
System.arraycopy(src[i], 0, dst[i], 0, src[i].length);
通用化处理(支持任意类型二维数组)
对于 T[][] 类型,只要元素类型 T 是基本类型或不可变对象(如 String),上述逻辑成立;若 T 是可变对象(如自定义类),还需对每个元素单独深拷贝——此时 arraycopy 不再适用,需手动克隆或序列化。
注意:System.arraycopy 仅适用于数组间复制,不能用于对象字段拷贝或嵌套结构递归展开。
更简洁的替代方案
虽然 arraycopy 高效,但手写循环或使用工具类更直观:
- 用 for 循环:清晰、易调试、兼容所有类型
- 用 Arrays.copyOf:对一维数组方便,二维仍需嵌套调用
- 用 Java 8 Stream:如
Arrays.stream(src).map(row -> row.clone()).toArray(int[][]::new)










