以正确的方式复制数组
我从笔记中看到了两个关于复制数组的例子。
下面给出的第一个例子表明它不是复制数组的方法。 但是,当我试图运行代码时,它设法将所有值从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
),因此两个变量( array1
和array2
)都引用相同的数组对象。
第二个示例实际上创建了第二个数组,并将原始数组的内容复制到它。
还有其他更简单的方法来复制数组。 您可以使用Arrays.copyOf
或System.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();
在第一个示例中,最终只有一个数组 , 其中有两个变量引用它。 赋值仅传递对数组的引用。 因此, firstArray
和secondArray
都指向同一个数组。 这不是副本。 尝试设置firstArray[0] = 99
并打印secondArray
,你会看到它是同一个数组。
在第二个示例中,它是一个实际的副本 – 您创建了一个新数组并复制了每个值。 现在,分配firstArray[0] = 99
将不会更改secondArray
引用的数组,因为它是一个副本 。
所以答案是:如果你给出第一种方式,你会得到更低的分数。
在实际使用中,有更好的方法来复制数组,使用System.arraycopy
, Arrays.copyOf
或firstArray.clone()
。
int[] secondArray = new int[5];
在第二个示例中,您将使用new
运算符创建一个int数组,并使用for循环手动将元素复制到该数组。 无论何时在java中使用new
运算符,都会发生新的内存分配(对象创建)。
在第一个中,它只是引用赋值,两者都指向同一个数组。 您可以轻松validation通过更改一个数组的内容,看到相同的效果进入第二个数组。 这不会发生在第二次arrays复制中。
int []array2=array1;