以正确的方式复制数组

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

下面给出的第一个例子表明它不是复制数组的方法。 但是,当我试图运行代码时,它设法将所有值从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是优选的。 如果您是我的讲师,我将应用示例1 ..与示例2方法相比,我会得到更少的标记或者只是相同?

第一个例子不复制任何东西。 它将原始数组的引用分配给新变量( 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); 

复制元素的完美方式是

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

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

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

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

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

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

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

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

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

 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(); 

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

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

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

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

 int[] secondArray = new int[5]; 

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

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

 int []array2=array1;