Java Stack peek()行为

时间:2015-07-01 08:19:06

标签: java stack peek

以下代码为除-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());
}

2 个答案:

答案 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。