【问题标题】:Defined variable changes value, if original value changes定义的变量改变值,如果原始值改变
【发布时间】: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-referencepass-by-value 错误。

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

【问题讨论】:

  • 您需要复制二维数组。
  • @TimBiegeleisen 感谢您的回答。你的意思是哪个二维数组? brd 和 brd_orig 是一维数组,不是吗?

标签: java for-loop reference


【解决方案1】:

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

【讨论】:

  • 啊,我明白了。一个常见的指针问题。谢谢你:)
猜你喜欢
  • 2013-03-14
  • 1970-01-01
  • 1970-01-01
  • 2013-03-06
  • 2019-03-11
  • 1970-01-01
  • 2015-01-07
  • 2022-12-05
  • 2012-04-13
相关资源
最近更新 更多