Stack.peek()比较为-1024返回错误的结果

时间:2018-09-07 14:39:43

标签: java java-8 stack

我拿了两个堆栈s1s2,用一些值初始化它们,最终,-1024top一样。

现在,如果我比较两种情况下的if的窥视,结果将是错误的。例如:

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

即使两个窥视都具有-1024作为值。

但是

如果我将值取到不同的变量中,然后进行比较,那很好。例如:

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

我用其他值(例如10)进行了检查。在这种情况下,直接观察比较可以很好地工作。

我是通过直接比较偷看来做错什么的吗,或者这与被比较的值有关?

下面是最小编码示例(我只是为了实现最小堆栈问题而这样做):

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

}

1 个答案:

答案 0 :(得分:1)

发生这种情况是因为Integer实习生。代表较小值的java.lang.Integer对象(例如10)是预先制造的,因此当您在两个单独的堆栈上推送自动装箱的10时,将推送同一对象。

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

当您添加int变量以接收peek()版的值时,自动拆箱会从int收集相同值的Integer个,因此-1024编写的代码可以再次使用。

您可以通过在条件中将==替换为equals来解决此问题:

if (s1.peek().equals(s2.peek())) --> returns true