数组赋值 vs. for 循环赋值

Array assignment vs. for loop assignment

在 class 我有一个私有数组

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 处是静态的,但另一个实际上来自另一个数组。为了清楚起见,我删除了它们。

这一行

array[0] = array[1];

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

如果你want/need清空一个数组的数据,用循环:forwhiledo-while,你觉得舒服的那个。

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

这是对正在发生的事情的说明:

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

如果你不想在重新赋值后保留之前版本的数组,你可以给元素1赋一个全新的数组,像这样:

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

好吧,我不认为你可以执行复制甚至简单的调用,除非你在 "proper way" 中寻址你的数组。

所以像

array[0]=array[1];

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

不会工作,但如果你写

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

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