如果原始值更改,则定义的变量更改值

Defined variable changes value, if original value changes

我有这段Java代码

private static void move(int[] brd) {
    int[] brd_orig = brd;
    System.out.println(Arrays.toString(brd_orig)); //Print brd_orig
    for(int i = 1; i < 12; i++)
         for(int j = 1; j < 12; j++) {
             int c = brd[i];  //Swap brd[i] and brd[j]
             brd[i] = brd[j]; //Swap brd[i] and brd[j]
             brd[j] = c;      //Swap brd[i] and brd[j]
         }
    System.out.println(Arrays.toString(brd_orig)); //Print brd_orig
}

我的目的是通过此行 int[] brd_orig = brd;.

保存参数 brd 以供以后在 brd_orig 中使用

现在我正在更改 brd,而不是在第二个 for 循环内更改 brd_orig。所以我的预期结果是 brd_orig 永远不会改变值。我用开头和结尾的打印来证明它,但它的表现并不像预期的那样。

当我运行函数由

move(new int[]{0, 1 ,1 ,0 ,1 ,0 ,0 ,0 ,0 ,0 ,0, 2});

真实输出是

[0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 2]
[0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 1, 1]

但是预期的输出是

[0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 2]
[0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 2]

我能够找到负责的线路

int c = brd[i];
brd[i] = brd[j];
brd[j] = c;

当我删除它们时,错误消失了,但我从未改变 brd_orig

我认为这可能是 按引用传递按值传递 错误。

为什么这段代码没有按预期运行?

在 Java 中,数组标识符指向位置,而不是值本身。所以 int[] brd_orig = brd; 的意思是“指向 brd_orig,一个 int[],指向与 brd 相同的位置”,因此它们是同一数组的不同标识符。您可以使用 .clone() or System.arraycopy() 来创建一个重复数组。