Bootstrap

Integer比较大小的奇怪问题

public class Test {
    public static void main(String[] args) {
        Integer a1 = 100;
        Integer a2 = 100;
        Integer a3 = 128;
        Integer a4 = 128;
        System.out.println(a1 == a2); //true
        System.out.println(a3 == a4); //false
    }
}

首先,两个对象比较是比较内存地址。也就是说,两个Integer直接比较是不会触发自动拆箱的。

那么为啥a1 == a2是true,a3 == a4却是false呢

这是因为java内部使用了享元模式,对-128到127之间的对象进行了缓存复用,所以a1、a2同一个对象。

那我让a1 = 200,岂不是a2也要等于两百?

显然不是这样的,这和String类似,实际上再赋值,a1的内存地址就变了。

从下面的源码可知,Integer对象的value一旦赋值是不可变的,因此要换value只能是换个Integer对象,然后把引用指向新的对象。

;