当我只更改复制的数组时,为什么我的原始数组会被更改?

时间:2017-04-02 12:23:33

标签: java arrays

这里我想为我的tile数组制作重复数组“arr”并对其进行一些更改,问题是当我进行更改时(在方法邻居中)它也适用于原始数组“tiles”

public class Board {
    private final int [][] tiles;
    // construct a board from an n-by-n array of blocks
    // (where blocks[i][j] = block in row i, column j)
    public Board(int[][] blocks) {
        tiles = blocks;
    }// all neighboring boards
    public Iterable<Board> neighbors() {
        Queue<Board> q = new LinkedList<>();
        int [][] arr = tiles;
        // do stuff
        if (y+1 < n) {
            int t = arr[x][y];
            arr[x][y] = arr[x][y+1];
            arr[x][y+1] = t;
            Board br = new Board(arr);
            if(!this.equals(br)) {
                q.add(new Board(arr));
            }
        }
        return q;
    } 
}

感谢您的时间

3 个答案:

答案 0 :(得分:1)

在Java数组中是对象。您可以使用clone()方法复制阵列。它将执行浅拷贝 - 它将与您的int数组一起正常工作。

int [][] arr = new int[tiles.length][];
for(int i = 0; i < tiles.length; i++)
    arr[i] = tiles[i].clone();
  1. copy a 2d array in java

答案 1 :(得分:1)

数组是Java中的对象。 Oracle doc

对象不会以这种方式重复。您的变量“tiles”和“arr”现在只是指向同一个数组,您还没有复制它。

要复制数组,请尝试System.arraycopy:

System.arraycopy( tiles, 0, arr, 0, tiles.length );

在此处查看有关系统副本的详情:https://docs.oracle.com/javase/7/docs/api/java/lang/System.html#arraycopy(java.lang.Object,%20int,%20java.lang.Object,%20int,%20int)

答案 2 :(得分:0)

您还没有复制数组,您只复制了对该数组的引用。两个变量都指的是同一个数组。请参阅此问题以制作数组的深层副本:How do I do a deep copy of a 2D array in Java?