为什么将数组复制到另一个数组会改变原始数组?

时间:2012-10-11 10:20:41

标签: java arrays multidimensional-array

当我将2D数组复制到另一个临时数组时,当我对临时数据执行操作时,它会更改我的原始数据。

以下是我的代码中显示我的意思的一部分:

public int getPossibleMoves(int color, int turn) {
  int x = 0;
  int blankI;
  blankI = -1;
  int pBoard[][];
  pBoard = new int[board.length][board.length];
  System.arraycopy(board, 0, pBoard, 0, board.length);

  //if its the first turn and color is black, then there are four possible moves
  if(turn == 0 && color == BLACK) {       
    pBoard[0][0] = BLANK;
    current.addChild(pBoard);
    current.children.get(x).setParent(current);
    System.arraycopy(board, 0, pBoard, 0, board.length);
    x++;

    pBoard[pBoard.length-1][pBoard.length-1] = BLANK;
    current.addChild(pBoard);
    current.children.get(x).setParent(current);
    System.arraycopy(board, 0, pBoard, 0, board.length);
    x++;

    pBoard[pBoard.length/2][pBoard.length/2] = BLANK;
    current.addChild(pBoard);
    current.children.get(x).setParent(current);
    System.arraycopy(board, 0, pBoard, 0, board.length);
    x++;

    pBoard[(pBoard.length/2)-1][(pBoard.length/2)-1] = BLANK;
    current.addChild(pBoard);
    current.children.get(x).setParent(current);
    System.arraycopy(board, 0, pBoard, 0, board.length);
    x++;
  }

在显示pBoard[0][0] = BLANK;及类似内容的行上,它会更改电路板以及pBoard,我需要电路板保持相同,以使我的程序正常工作。

我找到了一个与此类似的答案,我在这里想到了使用System.arraycopy()而不是pBoard = boardSystem.arraycopy()适用于我使用过的其他程序,但不适用于此程序 任何帮助是极大的赞赏。

还有一件事:
这是家庭作业的一部分。但是,解决这个小问题甚至不能让我接近我需要的最终产品。到目前为止,这只是我的代码的一小部分,但我需要通过这个继续前进。

2 个答案:

答案 0 :(得分:3)

你需要做一个深层复制。

而不是:

pBoard = new int[board.length][board.length];
System.arraycopy(board, 0, pBoard, 0, board.length);

尝试:

pBoard = new int[board.length][];
for ( int i = 0; i < pBoard.length; i++ ) {
  pBoard[i] = new int[board[i].length];
  System.arraycopy(board[i], 0, pBoard[i], 0, board[i].length);
}

答案 1 :(得分:1)

int board[][]是对int[]类型数组的引用数组。 System.arraycopy(board, 0, pBoard, 0, board.length)复制引用数组但不复制引用的数组,现在可以通过两种方式访问​​它们。要进行深度复制,您还必须复制引用的一维数组。注意,要制作数组的副本,您可以使用array.clone()。还要考虑使用大小为N * N且访问array[x+N*y]的一维数组。