1.什么是装箱与拆箱

javaSE5之前版本:如果要生成一个Integer对象,Integer i = new Integer(10)
javaSE5之后版本:提供了自动装箱的特点,生成一个Integer对象,只需要 Interger i = 10

1.基本数据转型转包装器类型,自动装箱
2.包装器类型转基本数据类型,自动拆箱

  1. /**
  2. * 代码解读 1:
  3. * 1.a1 = 200,底层会自动进行装箱操作
  4. * 2.底层会new Integer(),重新分配内存地址
  5. * 3.'=='比较的是引用地址(比较的是新内存地址)
  6. */
  7. int a1 = 200;
  8. int b1 = 200;
  9. // 所以返回值:true
  10. System.out.println(a1 == b1);
  11. /**
  12. * 1. int的缓存范围值是-128到127
  13. * 2. 当a1=200时,会把int转为包装类(Integer),此时底层会new Integer(),重新分配内存地址
  14. * 3. '=='比较的是引用地址,a1和a2都会进行装箱操作,已经new了新的地址,所有返回为false
  15. */
  16. /**
  17. * 代码解读 2:
  18. * 1.a2 = 200时,底层会交易是否缓存范围之外,缓存之内外,会开辟新的存储空间
  19. * 2.'=='比较的是引用地址(比较的是新内存地址)
  20. */
  21. Integer a2 = 200;
  22. Integer b2 = 200;
  23. // 所以返回值:false
  24. System.out.println(a2 == b2);

a1和a2是int基础类型,基础类型存储的是数值本身,那么只要是一样的数字肯定相等,就没有装箱拆箱一说,Integer是int的封装类,是一个对象,可以广义理解为Integer(引用数据类型)和int(基本数据类型)都可以表达数值但是数据类型不一样

实验

public class Test {

    public static void main(String[] args) {

        // 两个new出来的Integer类型的数据比较,相当于把new出来的地址作比较
        Integer a0 = new Integer(1);
        Integer a1 = new Integer(1);
        System.out.println("Integer 对象作比较 a0 == a1: " + (a0 == a1));
false



        // 调用intValue方法得到其int值
        System.out.println("使用intValue得到int值作比较 a0 == a1: " + (a0.intValue() == a1.intValue()));

        // 把Integer类型的变量拆箱成int类型
        int a2 = 1;
        System.out.println("将Integer自动拆箱 a1 == a2: " + (a1 == a2));
true 



        // Integer对象赋值比较,其实也是内存地址的比较
        // 自动装箱,如果在-128到127之间,则值存在常量池中
        Integer a3 = 30;
        Integer a4 = 30;
        System.out.println("Integer对象赋值比较 a3 == a4: " + (a3 == a4));
 true



        // Integer对象赋值(超过-128~127区间)比较
        Integer a5 = 128;
        Integer a6 = 128;
        System.out.println("Integer对象赋值(超过-128~127区间)比较 a5 == a6: " + (a5 == a6));
false


        // Integer对象赋值(超过-128~127区间)比较,调用intValue后再作比较
        Integer a7 = 128;
        Integer a8 = 128;
        System.out.println("Integer对象赋值(超过-128~127区间)比较,调用intValue后 a7 == a8: " + (a7.intValue() == a8.intValue()));
 true

        // 使用Integer类的equals()方法进行的是数值的比较 
        Integer a9 = 129;
        Integer a10 = 129;
        System.out.println("Integer类的equals()方法进行的是数值的比较 a9 == a10: " + a9.equals(a10));
true    
    }
}

总结

  1. Ingeter是int的包装类,int的初始值为0,Ingeter的初始值为null。
  2. 无论如何,Integer与new Integer()不会相等。不会经历拆箱过程,Integer i8 = new Integer(127)的引用指向堆,而Integer i4 = 127指向专门存放他的内存(常量池),他们的内存地址不一样,使用 == 比较都为false。
  3. 两个都是非new出来的Integer,使用 == 比较,如果数在-128到127之间,则是true,否则为false。
  4. 两个都是new出来的,==比较都为false。若要比较值是否相等,需使用equals方法进行比较。
  5. int和Integer(无论new否)比较,都为true,因为会把Integer自动拆箱为int再去比。