备份阵列

Backing up an Array

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

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

Node[][] grid;

以下是我的节点Class:

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;
    }
}

现在在解决难题的过程中的某个阶段,我可能会发现我需要进行各种猜测,我想做的是将网格的当前状态备份到另一个名为 Guess 的对象中,即结构如下:

public class Guess {

    public Node[][] grid;

    public int x;
    public int y;

    public Guess(Node[][] puzzle, int x, int y) {
        this.grid = puzzle;
        this.x = x;
        this.y = y;
    }
}

在此对象中,我希望复制当前网格,以及我猜测的节点的 X 和 Y 坐标。

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

我的一个朋友正在用 Java 脚本编写求解器,我知道它们是完全不同的语言,他 运行 遇到了一个问题,其中网格没有被备份,因为它仍在引用他创建的原始网格,因此如果猜测结果是错误的,则无法恢复到之前的状态。

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

Node[][] backup = currentGrid;

是否制作全新的副本?

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

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

Cat a = new Cat("Harry"); 
Cat b = a;
b.setName("Not Harry");
System.out.println(a.getName()) 

输出:"Not Harry".

您可以序列化您的对象或将状态变量写入文件以备份您的对象状态。

在Java中,任何类型的操作

Object a = b

将导致 a 引用当时 b 引用的同一对象。

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