如果需要,我可以发布更多代码,但在此之前我只想问一个关于以下方法的一般性问题,其中传递一个数组,然后设置为另一个数组,但由于某种原因原始数组,传入的那个也变了,这怎么可能/我该怎么办?
谢谢
tempBoard是一个和currentState大小相同的数组,temp[k]包含了movePiece中的变化,当前状态是在方法中声明的,不是全局变量
private int[][] MiniMaxBaseCase(int[][] currentState, int currentColor)
{
tempBoard = movePiece(currentState,temp[k]);
}
private int[][] movePiece(int[][] currentState, int[] move)
{
if(move[0] == -1)
return currentState;
//if the piece is just moving
if(move[4] == -1)
{
currentState[move[2]][move[3]] = currentState[move[0]][move[1]];
currentState[move[0]][move[1]] = 0;
return currentState;
}
//if the piece is jumping another
if(move[4] != -1)
{
currentState[move[4]][move[5]] = currentState[move[0]][move[1]];
currentState[move[2]][move[3]] = 0;
currentState[move[0]][move[1]] = 0;
return currentState;
}
return currentState;
}
在 Java 中:
- 方法参数确实是按值传递,但是
- Java 中的所有对象和数组变量都是引用变量。
引用变量被按值传递的净效果是指向的对象或数组引用变量是按引用传递。
您的数组实际上是按引用传递的 - 它是同一个数组。
具体来说,currentState
在 MiniMaxBaseCase
是对数组的引用 - 它的值是数组的内存位置。 currentState
在 MiniMaxBaseCase
按值传递给 movePiece
, 所以 currentState
的值在 MiniMaxBaseCase
(内存位置)如果复制到参数 currentState
在 movePiece
- 引用是按值传递的。但是现在currentState
在 movePiece
指向与 currentState
相同的内存位置在 MiniMaxBaseCase
.所以现在两个变量都指向同一个数组,即最终效果是数组实际上是按引用传递的。
编辑:复制多维数组
有人建议使用System.arraycopy()
或 Array.copyOf()
直接不遍历到第一个维度/索引。这行不通。
改用这个:
public static int[][] copyOf(int[][] original) {
int[][] copy = new int[original.length][];
for (int i = 0; i < original.length; i++) {
copy[i] = Arrays.copyOf(original[i]);
}
return copy;
}
直接复制不起作用的原因是因为在 Java 中,二维数组实际上是指向(分散的)一维数组集合的指针/引用数组,即 int[][]
是指向一堆(分散的)int[]
的指针数组.简单地做一个 System.arraycopy()
或 Arrays.copyOf()
在二维数组上将简单地将指针复制到分散的 int[]
数组,即这个浅拷贝最终共享底层数组集。您必须如上面的代码所示进行深拷贝。
一些引用资料:
How do I do a deep copy of a 2d array in Java?
Yes, you should iterate over 2D boolean array in order to deep copy it.
http://www.cs.dartmouth.edu/~spl/Academic/Java/JFAQs.html
如何复制多维数组?
...
Copying a two dimensional array is however more problematical because multi-dimensional arrays are represented as arrays of arrays. This is an issue when you are cloning an array. System.arraycopy() will give you a copy of the references to the embedded arrays. ...