编程语言
首页 > 编程语言> > 当比较Java中的Integer包装器时,为什么128 == 128 false但127 == 127为真?

当比较Java中的Integer包装器时,为什么128 == 128 false但127 == 127为真?

作者:互联网

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之间的数字为真.

解决方法:

当您在Java中编译数字文字并将其分配给Integer(大写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);
}

可以使用system属性将high的值配置为其他值.

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

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

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

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

请注意,出于性能原因,Integer缓存不存在,而是符合JLS, section 5.1.7;必须为-128到127(包括端点)的值给出对象标识.

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

this method is likely to yield significantly better space and time performance by caching frequently requested values. This method will always cache values in the range -128 to 127, inclusive, and may cache other values outside of this range.

标签:java,integer,pass-by-reference,pass-by-value,comparison
来源: https://codeday.me/bug/20190911/1802768.html