0

我有一个简单的 int 数组,初始化如下:

 int [][] tempArray=bp.getArray();//get array from other class(bp)
 //doing things with tempArray...

当我更改 tempArray 时,它也会更改bp.getArray();. 这是因为它引用了bp.getArray();?

4

2 回答 2

4

是的,如果你想要一个新的参考,这很容易,你必须使用Arrays.copyOf. 其他功能是Array.cloneSystem.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;
    }

这将深度复制一个二维数组。

于 2013-05-02T10:41:22.140 回答
-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可以用于返回顶部维度的长度。

另请参阅: 多维数组上的高效 System.arraycopy

希望这可以帮助。

于 2013-05-02T10:58:49.570 回答