这个问题在这里已有答案:
我拿了两个堆栈s1
和s2
,用一些值初始化它们,最终,两个都有-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();
}
}
这是因为Integer
实习。表示小值的java.lang.Integer
对象(例如10
)是预先制造的,因此当您将自动装箱的10
推到两个单独的堆栈上时,会推送相同的对象。
一旦到达peek()
代码中的位置,10
将返回相同的对象,但-1024
会返回两个不同的对象。这就是为什么==
为10
返回true,而不是-1024
。
当您添加int
变量以接收peek()
-ed值时,auto-unboxing负责从int
中获取相同值的Integer
s,因此-1024
的代码再次起作用。
你可以通过在条件中用==
替换equals
来解决这个问题:
if (s1.peek().equals(s2.peek())) --> returns true