java自动拆装箱过程中的底层原理

一·:先简单引一下自动拆装箱

 Integer integer=new Integer(100);//手动装箱
 Integer integer=100;             //自动装箱


Integer integer=new Integer(100);
int i=integer.intValue(); //手动拆箱
int i1=integer;           //自动拆箱

 

 二:本文的重点不是自动拆装箱,而是一些经常遇到的问题。

     (1):空指针问题。

package day_08;

public class student {
    public static void main(String[] args) {
       Integer integer=null;  //空指针赋给了integer的应用,这里的空指针会导致自动拆箱的函数没法被调用,所以下面就会报错
       integer+=300;        //报错信息为:NullPointerException
        System.out.println(integer);
    }
}

(2)装箱后的对象地址问题。

     先来看一段代码:

        Integer integer1=100;
        Integer integer2=100;
        System.out.println(integer1==integer2);//true

        Integer integer3=200;
        Integer integer4=200;
        System.out.println(integer3==integer4);//false

这里我们会很疑问,为什么同样都是数字,反而出现了两种不同的情况呢?只有一种情况,那就是范围问题。

诚然,确实是范围的原因:

 在Integer的构造函数中,它分两种情况: 

1、i >= 128 || i < -128 =====> new Integer(i)    
2、i < 128 && i >= -128 =====> SMALL_VALUES[i + 128]  //在java中,为了提高效率,系统以及预先划定了一个数组,我们不妨形象的称之为常量池

        在-128到128内,系统预先建立了一个常量池,如果装箱的数据在此范围内的话,就直接用这个常量池中的数据,这就避免了当装箱数据相同时时的对象重复建立问题,(根据我们所学,不管在哪门语言中,内存都是寸土寸金的,能少用就少用。)但是在-128到128这个范围之外数字太多了,系统不可能把每一个数字都放入常量池,只能碰到一个就建立一个新对象。对于java系统来讲,根据不同的范围的数据选取不同的构造方法,这种方法是效率最高的。

上述只是Integer的情况,其他包装数据类型哪?是否都是和Integer情况一样那?

 显然不是:我们从系统这样设计的目的入手就不难理解了,Double表示小数,拿上面的-128到128范围来讲,这个范围内小数比整数要多的多,所以再像Integer那样建个常量池的话就太耗内存了。所以就Double的构造函数就选择了碰着一个数就建立一个新对象的方法。

Double d1=100.0;
Double d2=100.0;
System.out.println(d1==d2); //false

但是另一个极端就是布尔类型,因为可选择的范围很少,所以系统选择直接放入常量池。

 Boolean i1 = false;
 Boolean i2 = false;
 Boolean i3 = true;
 Boolean i4 = true;
 
 System.out.println(i1==i2);//true
 System.out.println(i3==i4);//true

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ad_m1n

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值