以下代码为除-128和127之间的所有值返回false
。这有什么特别的原因吗?我知道我必须使用equals
,因为peek()
会返回对象的引用,但我很想知道为什么它仅适用于上述值范围。
public boolean test(int x) {
Stack<Integer> s1 = new Stack<Integer>();
Stack<Integer> s2 = new Stack<Integer>();
s1.push(x);
s2.push(x);
return (s1.peek() == s2.peek());
}
答案 0 :(得分:4)
这有两个原因:
当您进行自动装箱时,某些s1.push(x)
的{{1}}会转换为int x
。由于这是一个缓存值,因此可以为任何这些值重用相同的实例。
根据JRE的实施情况,s1.push(Integer.valueOf(x))
可能的缓存数量也大于此值 - 但不要依赖它;)
答案 1 :(得分:0)
在行
s1.push(x);
s2.push(x);
使用Integer.valueOf(x)
将原始int x
自动装箱到Integer
实例中(java自行完成)。该方法使用Cache来存储-127到128范围内的Integer
个实例,这意味着对于所有其他int
值,将在上面的两个代码行中创建一个新实例,从而生成在==
比较中返回false。