Java 对局部变量所做的更改是否链接到节点?

Java 对局部变量所做的更改是否链接到节点?,java,a-star,Java,A Star,我有以下用于构建节点的代码: public class Node { int state[][]; String totalPath; int gn; int hn; int fn; boolean isLeaf; Node parentNode; int zeroX; int zeroY; } 假设我构建了一个节点: 节点currentNode=新节点 但当我这么做的时候: int subState[][] = curr

我有以下用于构建节点的代码:

public class Node {
    int state[][];
    String totalPath;
    int gn;
    int hn;
    int fn;
    boolean isLeaf;
    Node parentNode;
    int zeroX;
    int zeroY;
}
假设我构建了一个节点: 节点currentNode=新节点

但当我这么做的时候:

int subState[][] = currentNode.state;
switcher = subState[ycheck-1][xcheck];
subState[ycheck-1][xcheck] = 0;
subState[ycheck][xcheck] = switcher;
为什么在打印substate[]]和currentNode.state[]]时,两个二维数组似乎是相同的?它不是应该像这样工作:子状态[]改变,但currentNode.state[]保持不变吗?为什么我对substate[]]所做的每一次更改都会对currentNode.state进行相同的更改?有解决办法吗

感谢那些愿意回答的人

两个二维阵列似乎是相同的

因为没有两个,只有一个。这一行:

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,因为m1和m2指的是同一地图对象

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

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


查看上一篇SO帖子以了解更多信息。

因为subState[]]和currentNode.state是同一个整数矩阵?@JennyMelody:我已经更新了我的答案,用一个更可靠的解决方案指向另一个答案。我建议使用此选项,而不是我以前的建议。int subState[][]=new int[3][];子状态[0]=currentNode.state[0]。克隆;子状态[1]=currentNode.state[1]。克隆;子状态[2]=currentNode.state[2]。克隆;。。。这同样有效!!!:D谢谢@JennyMelody:请看一下我在回答中链接的问题中投票最多的答案。这会帮助你解决你所追求的问题。@JennyMelody:很高兴它对你有用。尽管如此,我仍然建议在相关问题中采用这种方法。克隆有时会有点混乱;。基本上,.clone只克隆1D数组,所以我们必须一行一行地复制!!!谢谢你的帮助@npinti:D:D:D