将对象推向堆栈

时间:2015-01-10 11:07:34

标签: java stack push pop

我的堆栈有问题。我试图实现回溯来解决挂钉单人拼图。我无法将对象正确地对象推向堆栈。使用pop()时,它始终返回相同的对象。我尝试创建一个简单的java应用程序,这是我的代码:

Try s = new Try();
Integer x;

s.x=0;
mark.push(s);
s.x=1;
mark.push(s);
s.x=2;
mark.push(s);

while(!mark.isEmpty()){
    s= (Try) mark.pop();
    x = s.x;
    System.out.println(x.toString());
}

Try仅包含公开Integer变量。 表明: 2 2 2

而不是 2 1 0

请帮帮我。非常感谢你。

2 个答案:

答案 0 :(得分:0)

之所以发生这种情况,是因为您只有一个Try类的实例放置在堆栈中3次。所以显示了最后一个值(2)。

为每个push()

创建一个不同的Try实例

答案 1 :(得分:0)

正如已经指出的那样,你正在推动一个Try实例三次,但这里有一个更简单的场景来证明这一点:

public static void main(String[] args) {
    List<Test> list = new ArrayList<>();
    Test test = new Test();
    test.x = 1;
    list.add(test);
    test.x = 2;
    list.add(test);
    test.x = 3;
    list.add(test);
    System.out.println(list.stream().map(c -> new Pair<>(c.x, c == test)).collect(Collectors.toList()));
}

private static class Test {
    int x;
}

这输出[3=true, 3=true, 3=true] - 它们都是相同的对象,因此具有相同的值。

推送(或在我的示例中添加)对象只是传递对该对象的引用。你也有一个对象的引用;修改任何一个都会改变。如果要解决此问题,请每次都创建Try的新实例。