从JDK5后开始,为了减少开发人员的工作,Java提供了自动拆箱与自动装箱功能,下面就来讲解一下其内容

    • 自动装箱:把基本类型转换为包装类类型
    • 自动拆箱:把包装类类型转换为基本类型

    原理:自动装箱都是通过包装类的valueOf()方法来实现的.自动拆箱都是通过包装类对象的xxxValue()来实现的。

    好处:让基本类型也具有对象的特征,就出现了包装类型,将基本类型“包装起来”,使得它具有了对象的性质,并且为其添加了属性和方法,丰富了基本类型的操作,大大提高了开发效率

    1. Integer num =5; //自动装箱

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

    1. Integer a = new Integer(5); //自动拆箱
    2. int b= a;

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

    我们举几个例子来着重理解一下自动装箱和拆箱机制

    ==符号判断的是a和b在堆中所指向的对象是不是同一个;equals比较两个对象其结果是true当且仅当该参数不是null并且是Integer对象包含相同int值。

    1. // 题目一
    2. Integer i1 = new Integer(97);
    3. Integer i2 = new Integer(97);
    4. System.out.println(i1 == i2); //false
    5. System.out.println(i1.equals(i2)); //true
    6. System.out.println("-----------");
    7. // 题目二
    8. Integer i3 = 127;
    9. Integer i4 = 127;
    10. System.out.println(i3 == i4); //true
    11. System.out.println(i3.equals(i4)); //true
    12. System.out.println("-----------");
    13. // 题目三
    14. Integer i5 = 128;
    15. Integer i6 = 128;
    16. System.out.println(i5 == i6);
    17. System.out.println(i5.equals(i6)); //true
    18. // 题目四
    19. int i7=59;
    20. Integer i8=new Integer(59);
    21. System.out.println(i7==i8); //true

    题目一:为false的原因是生成了两个不同的对象i1,i2存放于堆中,那么这个结果就一定是false;equals结果只要两值相等就为true。

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

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

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

    1. public static Integer valueOf(int var0) {
    2. return var0 >= -128 && var0 <= IntegerCache.high ? IntegerCache.cache[var0 + 128] : new Integer(var0);
    3. }

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