数组赋值与循环赋值

时间:2015-10-18 21:34:19

标签: java arrays multidimensional-array variable-assignment

在课堂上我有一个私人数组

private boolean[][][] array;

后来被宣布为

array = new boolean[2][100][100]; //*

在某一点上,我想用第一个维度的第二个数组覆盖第一个维度中的第一个数组。我认为这应该工作

array[0] = array[1];

但是这产生了错误的行为。我试过这个简单的for循环:

for (int column = 0; column < array[0].length; column++) {
    for (int row = 0; row < array[0][0].length; row++) {
        array[0][column][row] = array[1][column][row];
    }
}

它按预期工作。

为什么第一段代码没有工作?

*第一个维度在2处是静态的,但另一个维度实际上来自另一个阵列。为清楚起见,我删除了它们。

3 个答案:

答案 0 :(得分:5)

第一段代码不起作用,因为它不复制数组维度,它别名它。数组是对象,因此赋值会创建对同一维度的第二个引用,并将其分配给第一个维度。这就是为什么你会得到一个不同的(和不正确的)行为。

以下是正在发生的事情的说明:

Reassignment

赋值从索引零处的顶部维度中删除100x100数组,并将其替换为对维度1处的100x100数组的引用。此时,对第一个数组的任何修改都会反映在第二个数组中,反之亦然

如果你不关心在重新分配后保留数组的先前版本,你可以为元素1分配一个全新的数组,如下所示:

array[0] = array[1];
array[1] = new boolean[100][100];

答案 1 :(得分:3)

这一行

array[0] = array[1];

说明存储在array[1]中的对象引用现在也将存储在array[0]中。由于Java中的数组是对象引用,现在array[0]array[1] 指向到同一位置。

如果您想要/需要清除数组的数据,请使用循环:forwhiledo-while,您感觉更舒服。

答案 2 :(得分:-1)

嗯,我不认为你可以进行复制甚至是简单的通话,除非你以正确的方式解决你的问题#34;

类似

array[0]=array[1];

array[0][1]=array[1][1];
如果你写的话,

不会工作

array[0][0][0]=array[1][0][0];

它会起作用,我猜测是因为编译器确定你在这里讨论相同的数组。