我拿了两个堆栈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)进行了检查。在这种情况下,直接观察比较可以很好地工作。
我是通过直接比较偷看来做错什么的吗,或者这与被比较的值有关?
下面是最小编码示例(我只是为了实现最小堆栈问题而这样做):
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();
}
}
答案 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