java - 数组似乎在 Java 中通过引用传递,这怎么可能?

标签 java arrays pass-by-reference

<分区>

如果需要,我可以发布更多代码,但在此之前我只想问一个关于以下方法的一般性问题,其中传递一个数组,然后设置为另一个数组,但由于某种原因原始数组,传入的那个也变了,这怎么可能/我该怎么办? 谢谢

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 中的所有对象和数组变量都是引用变量

引用变量按值传递的净效果是指向的对象或数组引用变量是按引用传递

您的数组实际上是按引用传递的 - 它是同一个数组。

具体来说,currentStateMiniMaxBaseCase是对数组的引用 - 它的值是数组的内存位置。 currentStateMiniMaxBaseCase按值传递给 movePiece , 所以 currentState 的值在 MiniMaxBaseCase (内存位置)如果复制到参数 currentStatemovePiece - 引用是按值传递的。但是现在currentStatemovePiece指向与 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. ...

关于java - 数组似乎在 Java 中通过引用传递,这怎么可能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4892992/

相关文章:

C++ 拉取信息并循环显示

c - 快速排序代码不适用于排序数组

c - 将值存储到结构数组值 C

java - Webview无法输入,是因为缺少设置吗?

c - 如何将局部结构传递给函数?

c++ - 从公共(public)派生类访问 protected 成员

c++ - 在 C++ 中使用对引用的引用的目的是什么?

java - 从现有集合创建新集合

c# - 动态调度系统使用什么算法?

java - 如何在 Android 上的 Spinner 中使用 itemClickListener