如何制作数组的副本,以使副本中的任何更改不会影响原始数据?

时间:2014-04-29 22:32:19

标签: java

我需要每次在循环中调用一个数组,并将其用作另一个方法的输入。然后从该方法的输出中,我将需要更新该数组的副本,并在ArrayList中更改后存储该副本。比如一个例子:

double[]a={1,2,3,4}

使用' a&#39>在作为输入的方法中,我将不得不更新' a'并存储在数组列表中但下次在循环中我需要原始的' a'再次。一旦我做了以下事情:

   double[]copya=a;
   copya[0]=10;

它改变了原来的' a'同样。我需要{' a'像:

a={1,2,3,4}

即使更新了副本。任何人都可以帮我解决这个问题吗?感谢。

3 个答案:

答案 0 :(得分:2)

制作copy时,您只创建了另一个参考变量,并为其指定了与a相同的对象。现在,acopy都引用相同的数组。

要复制数组的内容,您可以clone

double[] copy = a.clone();

它是一个浅层副本,但对于原始值,这将工作得很好。

答案 1 :(得分:1)

使用Arrays.copyOf(double, int)

  

使用零复制指定的数组,截断或填充(如有必要),以使副本具有指定的长度。对于在原始数组和副本中都有效的所有索引,这两个数组将包含相同的值。对于在副本中有效但不在原始副本中的任何索引,副本将包含0d。当且仅当指定的长度大于原始数组的长度时,这些索引才会存在。

答案 2 :(得分:0)

编辑:根据您在@Edward Samson的评论部分中添加的答案,下面是一个执行“深度复制”的方法"二维数组:

public static double[][] deepCopy(double[][] original) {
    if (original == null) return null;

    double[][] result = new double[original.length][];
    for (int i = 0; i < original.length; i++) {
        System.arraycopy(original[i], 0, result[i], 0, original[i].length);
    }
    return result;
}

原始回答

a.clone()Arrays.copyOf(double, int)外,您还可以选择使用System.arrayCopy(Object src, int srcPos, Object dest, int destpos, int length)

Javadoc如下:

  

[System.arrayCopy]将指定源数组中的数组从指定位置开始复制到目标数组的指定位置。数组组件的子序列从src引用的源数组复制到dest引用的目标数组。复制的组件数等于length参数。源数组中位置srcPos到srcPos + length-1的组件分别被复制到目标数组的destPos到destPos + length-1的位置。

示例用法可能如下所示:

public static void main(String[] args)
{
        int[] first = {1, 2, 3, 4, 5, 6};
        int[] second = {0, 2, 4, 6, 8, 10};

        // Copy two elements from arr1 starting from the second element
        // into arr2 starting at the fourth element:
        System.arraycopy(
                        first,   // From the first array
                        1,       // Starting from the second element
                        second,  // To the second array
                        3,       // Starting at the fourth element
                        2        // Copy two elements
                        );
}

输出(second)为{0, 2, 4, 2, 3, 10}

[来自http://msdn.microsoft.com/en-us/library/aa989638(v=vs.80).aspx]

的示例