我有一个像这样初始化的简单int数组:
int [][] tempArray=bp.getArray();//get array from other class(bp)
//doing things with tempArray...
当我更改tempArray时,它也会更改bp.getArray();
。
这是因为它引用了bp.getArray();
?
答案 0 :(得分:4)
是的,如果你想要一个新的参考,这很容易,你必须使用Arrays.copyOf
。其他功能包括Array.clone
和System.arrayCopy
。
Arrays.copyOf// is a Java 6 feature. For older versions switch to System.arrayCopy.
public static int[][] deepCopy(int[][] original) {
if (original == null) {
return null;
}
final int[][] result = new int[original.length][];
for (int i = 0; i < original.length; i++) {
result[i] = Arrays.copyOf(original[i], original[i].length);
}
return result;
}
这将深度复制二维数组。
答案 1 :(得分:-1)
正确的答案是,您需要一份深层副本。您被分配了引用(指针),而不是分配值。
Arrays.copyOf()或System.arraycopy()将起作用 - 但仅限于int []的底层。
在int [] []级别,如果你运行一个副本,你将获得一个指向相同底层数组的单独的顶级数组;不适当的深层复制。
要正确地进行(2级):
public int[][] copy2Deep (int[][] src) {
int[][] dest = new int[ src.length][];
for (int i = 0; i < src.length; i++) {
dest[i] = Arrays.copyOf( src[i], src[i].length);
}
return dest;
}
这应该有效 - 基本原则是int[][]
实际上是int[]
的一维数组,并添加了一些语法糖。
因此,创建数组时不需要知道底部维度(最初将填充'null'子数组),并且src.length
可用于返回顶部的长度尺寸。
另见: Efficient System.arraycopy on multidimensional arrays
希望这有帮助。