【问题标题】:how to make copy of array instead of reference in java? [duplicate]如何在java中制作数组的副本而不是引用? [复制]
【发布时间】:2013-07-06 05:33:12
【问题描述】:

我想将给定数组的精确副本复制到其他数组,但是即使我更改了新数组中任何值的值,它也不会更改原始数组中的值。 我尝试了以下代码,但在第三行之后,数组都发生了变化并获得了相同的值。

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 剪贴簿中测试了这段代码。

【问题讨论】:

  • @Kon 你看过他的代码吗? :)
  • 我的错,读得太快了。只需使用循环。

标签: java arrays parameter-passing variable-assignment pass-by-reference


【解决方案1】:

你必须复制数组的每一行;你不能复制整个数组。您可能听说过这称为深度复制。

接受你需要一个诚实至善的for循环。

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

【讨论】:

  • 谢谢@Louis 我发现 Arrays.copy 和 system.arraycopy 仅适用于一维数组,因为二维数组只是一维数组。
【解决方案2】:

System.arraycopy() 应该为您工作,但它不会作为一个整体复制,它根据 java 文档复制“从指定位置到指定位置”。

【讨论】:

  • 它不做深拷贝
  • @Universitas 我试过了,但没有帮助。
  • @meteors 问题不在于System.arraycopy() 的“位置”参数,而是它只进行浅拷贝,只拷贝n > 1 的n 维数组的第一层. 查看上面 cmets 中的“重复链接”和@Louis 的答案
猜你喜欢
  • 2015-08-03
  • 2017-04-12
  • 2011-09-25
  • 1970-01-01
  • 2012-01-02
  • 2017-06-23
  • 2011-08-16
  • 1970-01-01
  • 2021-11-09
相关资源
最近更新 更多