深入理解java自动拆箱装箱机制

什么是自动装箱?什么是自动拆箱?

所谓的装箱就是把基本数据类型转换成包装类,拆箱就是把包装类转换成基本数据类型

public static void main(String[] args) {        
        //1
        Integer a=new Integer(123);
        Integer b=new Integer(123);
        System.out.println(a==b);//输出 false

        //2 
        Integer c=123;
        Integer d=123;  
        System.out.println(c==d);//输出 true

        //3
        Integer e=129;
        Integer f=129;
        System.out.println(e==f);//输出 false
        //4
        int g=59;
        Integer h=new Integer(59);
        System.out.println(g==h);//输出 true
    }

用以上代码来诠释自动拆装箱机制

a==b中==符号判断的是a和b在堆中所指向的对象是不是同一个

题目1:为false的原因是生成了两个不同的对象a,b存放于堆中,那么这个结果就一定是false。

题目2:因为123这个值介于-128到127之间,在java内存的常量池中会存放一个123的常量,然后c,d两个对象都指向常量池中的123,所以判断为true。

题目3:因为129这个值超出了-128到127这个范围了,所以引用就不向常量池中进行引用了,就会重新生成一个129的Integer对象,故而e,f两个是不同对象,所以是false。

题目4:g==h是比较g,h,g是基本数据类型,h是包装类,这个时候包装类就会自动调用intValue()方法转换为基本数据类型,从而和g就是相等的,所以为true。

 

 

Integer b=3

3是int类型,如果要把int类型赋值给Integer包装类,就需要自动装箱,相当于Integer b=Integer.ValueOf(3).

 

Integer b= new Integer(3);

int a=b;

b是包装类,a=b是把b赋值给a,那么b这个包装类需要自动拆箱,相当于int a = b.intValue();

 

 

注意:除double 和float 两种类型以外,其他基本类型入Integer值 在 -128 ~ 127之间时不会新建一个Integer 对象而是从缓存中获取。所以在做 == 判断时 要注意值的大小,如果超过范围,则两个值 即使一样但  == 比较的结果还是false。

 

posted @ 2018-10-09 19:28  借我一个拥抱  阅读(535)  评论(0)    收藏  举报