Stack.peek()比较返回-1024的错误结果[重复]

问题描述 投票:0回答:1

我拿了两个堆栈s1s2,用一些值初始化它们,最终,两个都有-1024,因为那里有top

现在,如果我在if条件下比较两者的偷看,结果就会出错。例如:

if (s1.peek() == s2.peek()) --> returns false

即使两个偷看都有-1024作为价值观。

如果我将值放在不同的变量中,然后进行比较,那就可以了。例如:

int first = s1.peek();
int second = s2.peek();
if (first == second) --> returns true

我检查了其他值(例如10)。直接偷看比较在这种情况下工作正常。

我是通过直接比较偷看来做错事还是这与以某种方式比较的价值有关?

下面是最小的编码示例(我这样做是为了实现min stack问题):

public class MinStack {

    public static void main(String[] args) {
        MinStack minStack = new MinStack();
        minStack.push(512);
        minStack.push(-1024);
        minStack.push(-1024);
        minStack.push(512);
        minStack.pop();
        System.out.print(minStack.getMin());
        minStack.pop();
        System.out.print(minStack.getMin());
        minStack.pop();
        System.out.print(minStack.getMin());
    }

    Stack<Integer> originalStack;
    Stack<Integer> minStack;

    /** initialize your data structure here. */
    public MinStack() {
        originalStack = new Stack<>();
        minStack = new Stack<>();
    }

    public void push(int x) {
        originalStack.push(x);
        if(minStack.isEmpty() || minStack.peek() >= x)
            minStack.push(x);
    }

    public void pop() {
        if(originalStack.peek() == minStack.peek())
            minStack.pop();
        originalStack.pop();
    }

    public int top() {
        return originalStack.peek();
    }

    public int getMin() {
        return minStack.peek();
    }

}
java java-8 stack
1个回答
1
投票

这是因为Integer实习。表示小值的java.lang.Integer对象(例如10)是预先制造的,因此当您将自动装箱的10推到两个单独的堆栈上时,会推送相同的对象。

一旦到达peek()代码中的位置,10将返回相同的对象,但-1024会返回两个不同的对象。这就是为什么==10返回true,而不是-1024

当您添加int变量以接收peek()-ed值时,auto-unboxing负责从int中获取相同值的Integers,因此-1024的代码再次起作用。

你可以通过在条件中用==替换equals来解决这个问题:

if (s1.peek().equals(s2.peek())) --> returns true
© www.soinside.com 2019 - 2024. All rights reserved.