java - 数组赋值 vs. for 循环赋值

标签 java arrays multidimensional-array variable-assignment

在一个类中我有一个私有(private)数组

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

最佳答案

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

这是正在发生的事情的一个例子:

Reassignment

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

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

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

关于java - 数组赋值 vs. for 循环赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33203517/

相关文章:

Java7/Tomcat7 64 位 - JSP 页面中未呈现的字符串

javascript - [].forEach.call() 在 JavaScript 中做什么?

javascript - 如何对动态数组进行排序

javascript - 如何在 Redux reducer 中以不可变的方式交换数组元素?

C++读入二维数组问题

java - 如何返回包含二维数组中最小值的列 ID (Java)

java - 无法实例化 [java.util.List] : Specified class is an interface in GET request

java - 如何在 `lein repl` 运行时重新编译和重新加载 Java 源代码?

java - 使用base64将二进制文件发送到浏览器

c++ - 无法在我的 C++ 类中初始化 2d Vector