如何在Java中复制数组而不是引用?

4

我想要将一个给定的数组完全复制到另一个数组中,但是即使我改变新数组中的任何值,也不会改变原始数组中的值。我尝试了以下代码,但在第三行之后,两个数组都会发生改变并且具有相同的值。

int [][]a = new int[][]{{1,2},{3,4},{5,6}};
int[][] b = a;
b[1][0] = 7;

我也尝试了第二行的替代方案

int[][] b = (int[][])a.clone();

int [][] b = new int [3][2];
System.arraycopy(a,0,b,0,a.length);

int [][] b = Arrays.copyOf(a,a.length);

以上方法均未能解决问题。请为我提供一个适当的方法。我已在Eclipse Scrapbook中测试了此代码片段。


2
@Kon 你看过他的代码了吗? :) - Zong
我的错误,读得太快了。只需使用循环。 - Kon
2个回答

11

你必须复制数组的每一行;不能将整个数组作为一个整体进行复制。你可能听说过这被称为深拷贝。

要实现这个目标,你需要使用真正的 for 循环。

int[][] b = new int[3][];
for (int i = 0; i < 3; i++) {
  b[i] = Arrays.copyOf(a[i], a[i].length);
}

1
谢谢@Louis,我发现Arrays.copy和system.arraycopy仅适用于1d数组,因为2d数组只是数组的1d数组。 - meteors

-1

System.arraycopy() 应该适用于您,但它不会整体复制,而是根据 Java 文档中的说明“从指定位置到指定位置”进行复制。


2
它不进行深拷贝。 - Andreas Fester
@Universitas 我尝试了,但没有帮助。 - meteors
@meteors 问题不在于 System.arraycopy() 的 "position" 参数,而在于它只进行浅拷贝,仅复制 n 维数组的第一层,其中 n > 1。请查看上面评论中的 "duplicate link" 和 @Louis 的答案。 - Andreas Fester

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接