如果原始值更改,则定义的变量更改值
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()
来创建一个重复数组。
我有这段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()
来创建一个重复数组。