【问题标题】:Array changes value数组改变值
【发布时间】:2013-11-02 00:54:41
【问题描述】:
 boolean[][] grid = {{false,false},
                     {false,false}};
 WorldState test1 = new WorldState(grid,0,0);
 System.out.println(Arrays.deepToString(grid));

为什么我在 WorldState 中使用 in 后网格的布尔值会发生变化。它不应该保持错误,因为我没有为网格分配任何东西。 I 系统打印出网格,它是[[true, false], [false, false]]。我不明白真实来自哪里。请告诉我为什么它会变为 true。谢谢你。世界状态代码如下:

 public class WorldState
 {
     boolean[][]grid2;
     public WorldState(boolean[][] grid, int row, int col)
     {
        this.grid2=grid;
        this.grid2[row][col] = true;
     }
 }

【问题讨论】:

  • 数组和对象是通过引用而不是值来复制的。通过将一个数组分配给另一个数组,您并没有复制该数组,您只是告诉 Java 它们是相同的引用。你需要复制它。
  • 在Java Visualize运行你的代码,问题会更明显
  • 另见Arrays.copyOf(boolean[], int)复制数组docs.oracle.com/javase/7/docs/api/java/util/Arrays.html

标签: java arrays boolean


【解决方案1】:

所有这些都是引用同一个网格this.grid2=grid;。

试试这个

 boolean[][]grid2;
 public WorldState(boolean[][] grid, int row, int col)
 {
    int gridRow = grid.length;
    int gridCol = grid[0].length;

    grid2 = new boolean[gridRow][gridCol];

    for (int i = 0; i < gridRow; i++) {
        for (int j = 0; j < gridCol; j++){
            grid2[i][j] = grid[i][j];
        }
    }
    grid2[row][col] = true;
 }

【讨论】:

  • 谢谢..简单的解决方案..我看不到。
  • 请记住,如果索引不匹配,您将遇到问题。所以你可能需要一些有条件的if 语句来检查索引是否相等
猜你喜欢
  • 2022-12-02
  • 2021-05-29
  • 1970-01-01
  • 1970-01-01
  • 2013-05-08
  • 2019-03-11
  • 2016-03-19
  • 2020-08-18
  • 2016-10-24
相关资源
最近更新 更多