我有以下代码来构建节点:
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
中执行此操作时,会发生arrFoo
和arrBar
都查看相同的内存引用。这意味着对一个数组所做的任何更改都将隐式地对另一个数组进行。
请查看上一篇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",因为m1
和m2
引用了相同的映射对象。
由于您正在更改对象(数组)的状态,因此无论您通过哪个引用查看对象,都可以看到这种更改。