【发布时间】:2021-10-12 19:39:23
【问题描述】:
我有这段 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
}
我的意图是保存参数brd 以供以后在brd_orig 中通过这一行int[] brd_orig = brd; 使用。
现在我在第二个 for 循环中更改 brd,但不是 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。
我认为可能是 pass-by-reference 或 pass-by-value 错误。
为什么这段代码没有按预期运行?
【问题讨论】:
-
您需要复制二维数组。
-
@TimBiegeleisen 感谢您的回答。你的意思是哪个二维数组? brd 和 brd_orig 是一维数组,不是吗?