【问题标题】:Array assignment vs. for loop assignment数组赋值与 for 循环赋值
【发布时间】:2016-01-17 03:45:45
【问题描述】:

在一个类中我有一个私有数组

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];
    }
}

它按预期工作。

为什么第一个 sn-p 代码不起作用?

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

【问题讨论】:

  • 顺便说一句,我不确定我是否选择了最具描述性的标题。也许“直接数组分配与......”?我不确定前一个作业是否有特定名称。

标签: java arrays multidimensional-array variable-assignment


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    这一行

    array[0] = array[1];
    

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

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

    【讨论】:

      【解决方案3】:

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

      类似

      array[0]=array[1];
      

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

      不会工作,但如果你写

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

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

      【讨论】:

      • 我猜后者只能起作用,因为右手语句的计算结果是保存在数组中的类型。
      猜你喜欢
      • 2017-10-20
      • 1970-01-01
      • 1970-01-01
      • 2015-03-01
      • 2018-02-14
      • 1970-01-01
      • 2019-12-27
      • 1970-01-01
      • 2021-10-20
      相关资源
      最近更新 更多