Integer自动拆箱与自动装箱的相关问题

问题1
        Integer a = 9;
        int b = 9;
        boolean f = a==b;

这里的输出是true,通过断点分析发现,在进行**==**判断的时候Integer类型的a拆箱,然后再对像个int类型的数据进行比较

问题2
        Integer a = 9;
        int b = 9;
        boolean ff = a.equals(b);

这里自己先分析一下,应该是先对b进行装箱,让后再进行equal比较。断点分析一下,确实如此

通过断点测试发现:一个Integer·数据和一个int数据进行+,-,*,/,%运算都是先拆箱成int类型的数据在进行运算的

个人看法:开发jdk的类代码的人都是大牛中的大牛,考虑问题一定很完全,会找到之间复杂度与空间复杂度对小的实现来完成。所以自动拆箱与自动装箱的过程也就不难理解了

问题3
        Integer i=null;
        int j=i;

运行:

报错,NullPointerException

分析:i是Integer类型的值为null的对象,第二行,i进行拆箱调用intValue()方法代码如下

    public int intValue() {
        return value;
    }

从代码中可以发现return返回value,但实际上他写完整是:this.value 。所以当Integer对象为null拆箱时,会报空指针异常。

问题4
        Integer a=127;
        Integer b=127;
        Integer c=128;
        Integer d=128;
        System.out.println(a==b);
        System.out.println(c==d);

不妨先想想这个的输出结果,乍一看立马就会脱口而出两个true。

但实际上是true,false。

原因:

  1. Integer的值在-128到127时,Integer对象是在IntegerCache.cache产生,会复用已有对象,也就是说,这个区间的Integer可以直接用等号进行判断。
  2. Integer的值在-128到127之外时,Integer对象在堆上产生,不会复用已有对象,用等号会返回false
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值