数组初始化Riddle Java

时间:2014-05-15 10:58:53

标签: java arrays copy

我有这段代码:

int[] copyFrom = {1,2,3,4,5,6,7,8,9};
int[] copyTo   = new int[9];
copyTo = copyFrom;
copyFrom = new int[9];
System.out.println(copyTo[0]);

我得到的值是“1”..

据我所知copyTo = copyFrom只复制对数组的引用。 那么为什么当我初始化copyFrom时,copyTo仍然引用旧内存?

道歉,如果这是愚蠢或重复,我是新手用户。

5 个答案:

答案 0 :(得分:4)

以下是发生的事情:

int[] copyFrom = {1,2,3,4,5,6,7,8,9};
int[] copyTo   = new int[9];

可视化为

copyFrom ------------> [1,2,3,4,5,6,7,8,9]

copyTo   ------------> [0,0,0,0,0,0,0,0,0]

现在copyTo = copyFrom;使copyTo保持与copyFrom相同的值,因此新情况如下

copyFrom ---------+
                  |
                  +--> [1,2,3,4,5,6,7,8,9]
                  |
copyTo   ---------+ 

如你所见,仍然有两个引用,但它们只保持相同的值,因此更改其中一个不会影响其他(我正在谈论更改引用的值 - ref = new Value(); - 不是对象的状态他们持有ref.setParam(foo);

然后,您更改copyFrom引用以保留新数组copyFrom = new int[9];,现在您已

copyFrom ------------> [0,0,0,0,0,0,0,0,0]

copyTo   ------------> [1,2,3,4,5,6,7,8,9]

这就是System.out.println(copyTo[0]);打印1

的原因

答案 1 :(得分:1)

让我们这样说:

int[] copyFrom = {1,2,3,4,5,6,7,8,9}; //cpFrom holds memory addr 123 to the array
int[] copyTo   = new int[9]; //cpTo holds addr 456 to a new array
copyTo = copyFrom; //now cpTo and cpFrom hold same addr 123
copyFrom = new int[9]; //now cpFrom holds addr 789(new arr), but cpTo still holds 123

现在你看到了

答案 2 :(得分:0)

1- copyFrom -> array1 = {1,2..9}
2- copyTo -> array2 = new int[]
3- copyTo -> array1 (array2 is lost)
3- copyFrom -> array3 = new int[]

所以最后,copyTo指向第一个数组,因此答案。

答案 3 :(得分:0)

将引用复制到包含数据{1,2,3,4,5,6,7,8,9}的内存位置。 然后,当您初始化copyFrom时,它引用一个新的内存位置,而copyTo仍然引用第一个内存位置。

答案 4 :(得分:0)

当你做copyTo = copyFrom;在第3行。 copyTo指向第1行的数组,即copyFrom。在下一行中,您将copyFrom指向一个新的array.copyTo数组仍然指向第1行的数组,当您打印copyTo [0]时,它会选择它指向的数组的第一个元素。因此答案1。

希望它澄清。