我有一个简单的 int 数组,初始化如下:
int [][] tempArray=bp.getArray();//get array from other class(bp)
//doing things with tempArray...
当我更改 tempArray 时,它也会更改bp.getArray();
. 这是因为它引用了bp.getArray();
?
是的,如果你想要一个新的参考,这很容易,你必须使用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;
}
这将深度复制一个二维数组。
正确的答案是,你需要一个深拷贝。您被分配了引用(指针),而不是分配值。
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
可以用于返回顶部维度的长度。
另请参阅: 多维数组上的高效 System.arraycopy
希望这可以帮助。