对局部变量所做的更改将链接到节点



我有以下代码来构建节点:

public class Node {
    int state[][];
    String totalPath;
    int gn;
    int hn;
    int fn;
    boolean isLeaf;
    Node parentNode;
    int zeroX;
    int zeroY;
}

假设我已经构建了一个节点:Node currentNode = new Node();

但是当我这样做的时候:

int subState[][] = currentNode.state;
switcher = subState[ycheck-1][xcheck];
subState[ycheck-1][xcheck] = 0;
subState[ycheck][xcheck] = switcher;

为什么当我打印substate[][]和currentNode.state[][]时,两个2D数组看起来是一样的?它不是应该这样工作吗:子状态[][]更改,但currentNode.state[][]保持不变?为什么我对substate[]所做的每一次更改,对currentNode.state都是一样的?有解决办法吗?

感谢那些愿意回答的人!

当您在java arrFoo = new array; arrBar = arrFoo中执行此操作时,会发生arrFooarrBar都查看相同的内存引用。这意味着对一个数组所做的任何更改都将隐式地对另一个数组进行。

请查看上一篇SO文章以了解更多信息。

看起来两个2D阵列都是相同的

因为没有两个,所以只有一个。此行:

int subState[][] = currentNode.state;

currentNode.state数组提供引用,而不是其副本

Map<String, String> m1 = new HashMap<String, String>();
Map<String, String> m2 = m1;
m1.put("one", "uno");
System.out.println(m2.get("one"));

显示"uno",因为m1m2引用了相同的映射对象。

由于您正在更改对象(数组)的状态,因此无论您通过哪个引用查看对象,都可以看到这种更改。

最新更新