在Java中复制数组时出现意外结果

时间:2015-02-09 21:41:20

标签: java

如何获得以下程序的输出123346: 5去哪了?

public class TestClass {

     public static void main(String[] args) {
         int[] scores = { 1, 2, 3, 4, 5, 6};
         System.arraycopy(scores, 2, scores, 3, 2);
         for(int i :  scores)
             System.out.print(i);
    }

}

4 个答案:

答案 0 :(得分:2)

您在技术上覆盖5(以及4)。请参阅documentation

源和目标对象相同,您的length参数为2,而索引不同,因此,每个索引处的两个数字将被复制那些职位。

来源数字和职位:

1 2 [3 4] 5 6

目的地职位:

1 2 3 [4 5] 6

结果:

1 2 3 [3 4] 6

答案 1 :(得分:2)

System.arraycopy(scores, 2, scores, 3, 2);

这会将2个项目从源索引2复制到{3,4}到目标位置3.由于您的源阵列和目标阵列是相同的,因此您将用4覆盖5

          {3  4}      <== items copied
{ 1, 2, 3, 4, 5, 6}   <== original

  0  1  2  3  4  5    <== indexes

{ 1, 2, 3, 3, 4, 6}   <== output, the 4 has overwritten the 5, damn

答案 2 :(得分:1)

这不是一段非常有用的代码,但您所做的是将从索引2开始的源数组中的2个元素复制到以索引3开头的数组。

实际上你到达时: 1,2,3,3,4,6

System.arraycopy将元素从源数组复制到目标数组。方法签名是: arraycopy(sourceArray, sourceIndex, destinationArray, destinationIndex, howManyElementsToCopy)

您所做的是将数组指定为源和目标。因此,您的代码开始将元素从源数组(第一个参数 - 得分)复制到目标数组(第三个参数 - 得分)。它复制了2个元素(最后一个方法参数 - 2)。它开始将元素从索引2处的源数组(方法中的第二个参数)复制到以索引3(第四个参数)开始的目标数组。

可视化:

INDEX:        0  1  2  3  4  5
                    3, 4        <- values that are copied (2 elements from index 2)
source:      [1, 2, 3, 4, 5, 6]
                       4, 5     <- those valuse are overwriten (2 elements from index 3)
destination: [1, 2, 3, 4, 5, 6] <- in your case the same array as source                           
                       3, 4     <- values from source copied into destination
result:      [1, 2, 3, 3, 4, 6]

答案 3 :(得分:0)

以下是来自javadoc的arrayCopy的方法签名: public static void arraycopy(Object src,              int srcPos,              对象dest,              int destPos,              int length)

在你的电话中:arrayCopy(分数,2,分数,3,2);第二个参数是从哪里开始复制的源位置(在数组中为2和索引&#39; 3&#39;)。

阵列索引:0 1 2 3 4 5
  得分1 2 3 4 5 6

同样,第四个参数是目标位置(在您的数组中为3并且索引&#39; 4&#39;

阵列索引:0 1 2 3 4 5
得分1 2 3 4 5 6

最后,最后一个参数是要复制的字符串的长度(即2),因此在位置3复制3和4以提供输出

阵列索引0 1 2 3 4 5
得分1 2 3 3 4 6