小编典典

为什么在比较 Java 中的整数包装器时 128==128 为假但 127==127 为真?

all

class D {
public static void main(String args[]) {
Integer b2=128;
Integer b3=128;
System.out.println(b2==b3);
}
}

输出:

false

class D {
    public static void main(String args[]) {
        Integer b2=127;
        Integer b3=127;
        System.out.println(b2==b3);
    }
}

输出:

true

注意:-128 到 127 之间的数字为真。


阅读 101

收藏
2022-07-12

共1个答案

小编典典

当您在 Java 中编译数字文字并将其分配给整数(大写I)时,编译器会发出:

Integer b2 =Integer.valueOf(127)

使用自动装箱时也会生成这行代码。

valueOf实现了某些数字被“池化”,并且它为小于 128 的值返回相同的实例。

从 java 1.6 源代码,第 621 行:

public static Integer valueOf(int i) {
    if(i >= -128 && i <= IntegerCache.high)
        return IntegerCache.cache[i + 128];
    else
        return new Integer(i);
}

可以使用系统属性将 的值high配置为另一个值。

-Djava.lang.Integer.IntegerCache.high=999

如果您使用该系统属性运行程序,它将输出 true!

显而易见的结论:永远不要依赖两个相同的引用,总是将它们与.equals()方法进行比较。

因此b2.equals(b3),对于 b2,b3 的所有逻辑相等值,将打印 true。

请注意,Integer缓存不是出于性能原因,而是为了符合JLS,第 5.1.7
;必须为值
-128 到 127(含)提供对象标识。

Integer#valueOf(int)也记录了这种行为:

通过缓存频繁请求的值,此方法可能会显着提高空间和时间性能。此方法将始终缓存 -128 到 127(含)范围内的值,并且可能缓存此范围之外的其他值。

2022-07-12