[java基础] int 和 Integer的爱恨情仇

下面是一段经典的程序:

package com.aran.basicDataType;

/**
 * @Author Aran
 * @Date 2020/6/16 6:42 下午
 */
public class IntegerAndInt {
    public static void main(String[] args) {
        Integer v1 = 10;
        Integer v2 = 10;

        System.out.println(v1 == v2);

        Integer v3 = 200;
        Integer v4 = 200;

        System.out.println(v3 == v4);
    }
}

你说吧,会输出啥?大声说出来?

想不想直到结果?

想不想?

你就说想不想?

没错,你想对了,就是这样的:

输出:

true
false

这个要源于 Integer 与 int 的 自动装箱与自动拆箱 设计,重点来了:

对于值在 -127 ~ 128的值(这是int 的初始化范围),Integer = 10;这样的自动装箱操作会直接从int所初始化的常量池中进行取值,这么做是为了加大简单数字的重复利用。所以,上面的第一个输出就是true;


于是乎,第二个输出的结果也就可以理解了,Integer v3 = 200;相当于 Integer v3 = new Integer(200); Integer v4 = 200;相当于 Integer v4 = new Integer(200);
200 > 128 ,所以:他们会在栈中new 200,两个的地址不一样,所以当然不 ==


总结:

  1. 两个 new 出来的 Integer 进行比较,永远不会相等(内存地址不同)
  2. Integer 与int 比较时,会自动 对 Integer 进行 拆箱 操作,即实际是两个 int 进行比较,只要值相等,则比较结果相等
  3. 通过 Integer i = new Integer(aNumber)Integer i = aNumber 的比较不会相等,因为当 -128 < i < 127 时,前者为 在内存中新建的对象,而后者来自常量池,内存地址不同,所以不相等;而不在这个范围时,两个都是在内存中新建的对象,地址也是不同的,所以也不会相等。
  4. 而两个 Integer i = aNumber 生成的数值,就要根据3中的范围来判断,如果在范围之内,则全部自动拆箱,取自常量池,值相等则相等,否则不会相等。

积跬步,至千里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值