以正确的方式复制数组

时间:2015-09-27 08:51:46

标签: java arrays

我从笔记中看到了两个关于复制数组的例子。

下面给出的第一个例子表明它不是复制数组的方法。但是,当我尝试运行代码时,它设法将所有值从array1复制到array2。

    int []array1={2,4,6,8,10};
    int []array2=array1;
    for(int x:array2){
        System.out.println(x);
    } 

给出的第二个例子是说复制数组的正确方法。

int[] firstArray = {5, 10, 15, 20, 25 };
int[] secondArray = new int[5];
for (int i = 0; i < firstArray.length; i++)
  secondArray[i] = firstArray[i];

我的问题是,这2个例子是否适合用于编码,或者实施例2是优选的。如果您是我的讲师,我将应用示例1 ..与示例2方法相比,我会得到更少的标记,或者只是相同?

5 个答案:

答案 0 :(得分:7)

第一个例子没有复制任何东西。它将原始数组的引用分配给新变量(array2),因此两个变量(array1array2)都引用相同的数组对象。

第二个示例实际上创建了第二个数组,并将原始数组的内容复制到它。

还有其他更简单的方法来复制数组。您可以使用Arrays.copyOfSystem.arraycopy,而不是通过for循环显式复制数组元素。

int[] secondArray = Arrays.copyOf (firstArray, firstArray.length);

int[] secondArray = new int[firstArray.length];
System.arraycopy(firstArray, 0, secondArray, 0, firstArray.length);

答案 1 :(得分:4)

复制元素的完美方式是

System.arraycopy(array1,0, array2, 0, array1.length);

上面的代码替换了第二个避免for循环的例子。

在第一个例子中,您只是引用了第一个数组。因此,从第二个数组中可以看到第一个数组发生的变化。

  

我的问题是,这2个例子是否适合用于编码,或者实施例2是优选的。

再次看,他们没有做比较的事情。第一个指向数组引用,第二个代码段引用它的元素。所以你无法比较它们。

还有其他方法来复制数组元素,就像其他提到的一样,我更喜欢System.arraycopy,因为

1)Arrays.copyOf在内部创建另一个数组对象,并在System.arraycopy使用传递的数组时将其返回。

2)克隆太慢了。除非别无选择,否则不要使用它。 我避免克隆的原因很少。这是 Josh Bloch analysis on clone vs copy constructor克隆单个元素时)。

答案 2 :(得分:3)

要演示第一种方法的问题,请尝试以下方法:

int[] array1 = {2, 4, 6, 8, 10};
int[] array2 = array1;
array1[0] = 0;
System.out.println(array2[0]);

您认为这会印刷什么?

  

0

它将打印0,因为array2现在指向array1: 这两个变量现在引用同一个对象, 所以修改其中任何一个的内容似乎都会修改它们。

因此,您的第一个方法不会被称为复制数组。 这是一个简单的任务,从一个变量到另一个变量, 在这种情况下,将array1的值分配给array2, 这样两个变量都指向同一个东西。

至于你的第二种方法, 这是完成同样事情的一种更简单的方法:

int[] array2 = array1.clone();

答案 3 :(得分:2)

在第一个示例中,最终只有一个数组,其中两个变量引用。赋值仅传递对数组的引用。因此firstArraysecondArray都指向同一个数组。它不是副本。尝试设置firstArray[0] = 99并打印secondArray,您就会看到它是同一个数组。

在第二个示例中,它是一个实际的副本 - 您创建了一个新数组并复制了每个值。现在,分配firstArray[0] = 99不会更改secondArray引用的数组,因为它是副本

所以答案是:如果你采用第一种方式,你会得到更低的分数。

在实际使用中,有更好的方法可以使用System.arraycopyArrays.copyOffirstArray.clone()来复制数组。

答案 4 :(得分:0)

int[] secondArray = new int[5];

在第二个示例中,您将使用new运算符创建一个int数组,并使用for循环手动将元素复制到该数组。无论何时在java中使用new运算符,都会发生新的内存分配(对象创建)。

在第一个中,它只是引用赋值,两者都指向同一个数组。您可以轻松验证通过更改一个数组的内容,可以看到相同的效果进入第二个数组。这不会发生在第二次阵列复制中。

int []array2=array1;