在基元数组中重新分配数组值不会更改数组

Big*_*air 2 java multidimensional-array

我尝试用2个循环设置2D布尔数组的值,如下所示:

 boolean[][] frame = new boolean[10][4];
    for (boolean[] column : frame)
        for (boolean b : column)
            b = true;
Run Code Online (Sandbox Code Playgroud)

但这似乎没有用,所有的布尔都是假的,为什么呢?

For*_*ega 6

您无法为数组中的对象分配新值,因为原始对象不会更改.以下代码将起到作用.

boolean[][] frame = new boolean[10][4];
for (boolean[] column : frame)
    for (int i = 0; i < column.length; i++)
        column[i] = true;
Run Code Online (Sandbox Code Playgroud)

更多解释:

该数组包含指向布尔值的元素.将数组中某个元素的值赋给名为b(for (boolean b : column))的变量时,该变量b指向数组中元素指向的同一对象.接下来,将变量b指向true.现在,b将是真的.但是,数组中的元素仍指向同一个对象.

我希望现在很清楚.图像会让它更容易理解......

  • 你能解释为什么OP的代码不起作用吗? (3认同)

dje*_*lin 5

因为您要重新分配b哪个是的副本column[i],而不是column[i]本身。Java中的基元是(或至少是“最好的”),是通过值(而不是通过引用)传递/复制的。

更准确地说,Java是按引用传递值,它摆脱了业余的“按值传递” /“按引用传递”二分法。对于基元,我不知道它们是否“严格地说”是按值计算的,但是它们是不可变的,因此在这种情况下没有语义上的区别。例如

public class Foo {
      public int x;

      public static void main(String args[]) {
            Foo a = new Foo();
            Foo b = a;
            Foo c = new Foo();
            a.x = 1; //b.x is now 1
            b.x = 2; //a.x is now 2
            a = c;
            a.x = 3; //b.x is still 2 because a's reference changed
      }
}
Run Code Online (Sandbox Code Playgroud)

理解该代码,您将了解自己的问题。