Java 堆栈 peek() 行为

Java Stack peek() behavior

以下代码 returns false 用于除 -128 和 127 之间的所有值。这有什么特别的原因吗?我知道我必须使用 equals 因为 peek() returns 对对象的引用,但我很想知道为什么它只适用于上述值范围。

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

这有两个原因:

当您自动装箱时,某些 int xs1.push(x) 会转换为 s1.push(Integer.valueOf(x))。因为这是一个缓存值,所以相同的实例会被重复用于这些值中的任何一个。

根据 JRE 的实现,Integer可能 也有比它更大的缓存——但不要依赖它 ;)

行中

s1.push(x);
s2.push(x);

原始 int x 使用 Integer.valueOf(x) 自动装箱到 Integer 实例中(java 自己完成)。该方法使用缓存来存储 -127 到 128 范围内的 Integer 个实例,这意味着对于所有其他 int 值,将在上面的两行代码中创建一个新实例,结果在 == 与 return 的比较中 false.