Java中Integer包装类之间的比较问题

Integer 是Java中的包装类,通常情况下,两个相同值的Integer对象实例用 “==” 运算符进行比较时,返回结果应该是false,但是实际情况却不是这样。

 public static void main(String[] agrs){
        Integer integer1 = 1;
        Integer integer2 = 1;
        System.out.println(integer1==integer2);
    }
复制代码

运行结果:

这是为什么?

但是稍微改动一下情况就会不同:

    public static void main(String[] agrs){
        Integer integer1 = 128;
        Integer integer2 = 128;
        System.out.println(integer1==integer2);
    }
复制代码

运行结果:

可以注意到,这两段程序的不同之处仅仅在integer的值上,一个的值是 1 ,另外一个是 128,比较起来的结果完全不同。

这是为什么?

单步调试看一下:

当赋值128时:

Integer = 128 赋值操作得时候跳到了valueOf函数:

在这个if语句中 low和high的值分别是-128和127,所以最后返回给integer1的时候返回的就是一个新的Integer对象实例,在堆中开辟了新的空间,所以 “==” 的结果理所当然是false,也就是预期结果。

当赋值1时:

Integer = 1 赋值操作得时候也跳到了valueOf函数:

那么这个时候由于1在-128到127之间,所以返回的是 IntegerCache.cache 数组里的对象,从源码中可以看到,cache数组的定义如下:

而这段代码是存在于静态代码块里的:

也就是说:在Integer类被加载之后,cache数组就被初始化成了一个储存了-128~127的顺序的Integer数组,按照上面的代码逻辑,所有用 “=” 赋值的操作,如果值在-128~127之间,实际上指向的都是同一个位置。所以 “==” 的返回值是true

转载于:https://juejin.im/post/5c7fc8166fb9a049eb3cb402

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值