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