备份阵列

时间:2015-04-13 19:50:50

标签: java arrays pointers reference

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

我正忙着为ProjectEuler问题写一个Sudoku Solver,我正在使用2D节点数组(自定义对象):

Node[][] grid;

以下是我的节点类:

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是否会制作网格的完整副本,或者只是使用指向原始网格的指针?

我的一个朋友正在用Javascript编写一个Solver,我知道他们是完全不同的语言,他遇到了一个问题,网格没有被备份,因为它仍然引用他创建的原始网格如果猜测结果是错误的,那么就无法恢复到之前的状态。

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

Node[][] backup = currentGrid;

是否制作了全新的副本?

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

2 个答案:

答案 0 :(得分:1)

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

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

输出:“不是哈利”。

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

答案 1 :(得分:1)

在Java中,任何类型的操作

Object a = b

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

如果修改了对象(通过ab或任何其他参考),则无论使用何种参考来进行更改,都会反映出更改。

相关问题