Java 备份阵列

Java 备份阵列,java,arrays,pointers,reference,Java,Arrays,Pointers,Reference,我很好奇Java将如何处理以下情况,我将提供一些关于我正在做什么的见解 我正忙于为ProjectEuler问题编写数独解算器,我正在使用2D节点数组(自定义对象): 以下是我的节点类: public class Node { public int x; public int y; public int value; public int quadrant; public ArrayList<Integer> possibleNumber

我很好奇Java将如何处理以下情况,我将提供一些关于我正在做什么的见解

我正忙于为ProjectEuler问题编写数独解算器,我正在使用2D节点数组(自定义对象):

以下是我的节点类:

public class Node {

    public int x;
    public int y;

    public int value;

    public int quadrant;

    public ArrayList<Integer> possibleNumbers;

    public SudokuNode() {}

    public SudokuNode(int x, int y, int value, int quadrant) {
        this.x = x;
        this.y = y;
        this.value = value;
        this.quadrant = quadrant;
        this.possibleNumbers = new ArrayList<Integer>();
    }

    public ArrayList<Integer> getArray() {
        return possibleNumbers;
    }
}
在这个对象中,我希望复制当前网格,以及我猜测的节点的X和Y坐标

我好奇的是,Java是否会制作网格的完整副本,或者仅仅使用指向原始网格的指针

我的一个朋友正在用Javascript编写一个解算器,我知道它们是完全不同的语言,他遇到了一个问题,网格没有被备份,因为它仍然引用他创建的原始网格,因此在猜测结果错误的情况下无法恢复到以前的状态

我只是想了解当我说做这样的事情时会发生什么:

Node[][] backup = currentGrid;
它是否是一个全新的副本


对不起,如果这是一个重复的或愚蠢的问题问。我在自学编程,因此我可能错过了一些东西,或者只是不理解一些核心概念。

当您将对象引用传递给构造函数或其他方法时,新引用总是指向原始引用所指向的同一对象

Cat a = new Cat("Harry"); 
Cat b = a;
b.setName("Not Harry");
System.out.println(a.getName()) 
输出:“不是哈利”。


可以序列化对象,也可以将状态变量写入文件以备份对象的状态

在Java中,任何类型的操作

对象a=b

将导致
a
引用与
b
在该时间点引用的对象相同的对象


如果对象被修改(通过
a
b
或任何其他引用),那么无论使用什么引用来访问它,更改都会被反映出来。

哇,这么长的问题,这么简单的问题。你可以用一句话问这个问题。答案是否定的,它不会生成一个新的副本。为什么不对它进行测试…创建一个创建副本的构造函数
public Node(Node n)
。@popovitsj这不是传递任何东西,只是赋值
reference
变量。你的网格是一个引用类型,您将创建一个指向CurrentGrid的变量谢谢您的示例,我可能会编写一个新函数来创建一个新的网格,并在其中循环并重写所有数据,但这将大大降低解算器的速度。我想无论我是这样做还是将其写入文件,它仍然会相对缓慢?老实说,我不认为Project Euler问题需要使用文件序列化或保存状态。我想如果你再多想一点,你可以想出一个设计,你可以把状态保存在内存中。
Node[][] backup = currentGrid;
Cat a = new Cat("Harry"); 
Cat b = a;
b.setName("Not Harry");
System.out.println(a.getName())