2015-10-18 161 views
4

在一个类中我有一个私人阵列数组赋值与for循环分配

private boolean[][][] array; 

稍后宣布为

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

在某一点上我想覆盖在第一阵列第一维与第一维的第二阵列。我认为这应该工作

array[0] = array[1]; 

但这产生了错误的行为。我试过这个简单的for-loop:

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,但其他实际来自另一个数组。为了清晰我删除了它们。

+0

顺便说一句,我不知道我是否选择了最具描述性的标题。也许“直接排列vs ...”?我不确定前面的作业是否有特定的名称。 – problemofficer

回答

5

第一个代码片段没有工作,因为它没有副本阵列方向,它别名它。数组是对象,因此该分配会创建对同一维的第二个引用,并将其分配给第一维。这就是为什么你得到一个不同的(和不正确的)行为。

这里是正在发生的事情的图示:

Reassignment

分配滴从顶部尺寸索引零的100×100阵列,并且在尺寸1到100×100阵列的引用替换它此时对第一个数组的任何修改都会反映在第二个数组中,反之亦然。

如果你不关心保持阵列的先前版本重新分配后,您可以分配一个全新的数组元素1,像这样:

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

此行

array[0] = array[1]; 

美国存储在array[1]对象引用将现在还保存在array[0]。由于Java中的数组是对象引用,现在array[0]array[1]指向到相同的位置。

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

-1

好吧,我不认为你可以执行复制或者甚至是简单的调用,除非你以“正确的方式”处理你的数组。

因此,像

array[0]=array[1]; 

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

将无法​​正常工作,但如果你写

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

它会工作,我猜,因为编译器肯定你在这里讨论相同的数组。

+0

我猜测后者只能用,因为右手语句的计算结果是保存在数组中的类型。 – problemofficer