1.自动装箱(Autoboxing)

基本数据类型不是对象,没有可以调用的方法,可以使用它的包装类型来调用一些如toString(),getClass()之类的方法。

如:Integer i = 10; 这时编译器实际执行的是 Integer i = Integer.valueOf(10);

这就是自动装箱。自动装箱就可以把一个基本数据类型子动变成一个包装类型。

使用反编译软件查看:

java 拆 箱 自动 装 java中什么是自动拆装箱_自动装箱

2.自动拆箱(unboxing)

自动拆箱跟自动装箱相反,自动拆箱是把Integer这样的包装类型重新简化为基本数据类型。

如: int k = new Integer(2); 这时编译器实际执行的是int k = new Integer(2).intValue();

这就是自动拆箱。使用反编译软件查看:

java 拆 箱 自动 装 java中什么是自动拆装箱_缓存_02

3.基本数据类型对应的包装类型的自动装箱池大小

  • Byte,Short,Integer,Long默认情况下是-128~127
  • Character的是0~127
  • Float和Double没有自动装箱池

4.装箱池的作用

在装箱池指定的范围内会有缓存对象,加入是在范围的值会直接取已有的缓存对象,而不会new一个。
例如:

public static Integer valueOf(inti) {    
        if(i >= -128 &&i <=IntegerCache.high)  // 没有设置的话,IngegerCache.high 默认是127  
           //如果i在-128~high之间,就直接在缓存中取出i的Integer类型对象  
           return IntegerCache.cache[i + 128];    
        else  
           return new Integer(i); //否则就在堆内存中创建   
    }

5.实例

Integer integer1 = 100;
        Integer integer2 = 100;
        Integer integer3 = 200;  
        Integer integer4 = 200;  
        Integer integer5 = new Integer(100);  
        Integer integer6 = new Integer(100); 
        int int1 = 100;  
        int int2 = 200;  

        System.out.println("integer1==integer2: " + (integer1 == integer2));
        //ture  自动装箱,两个缓存中的Integer对象的引用来进行比较,所以是true

        System.out.println("integer1.equals(integer2): " + (integer1.equals(integer2)));
        // true Integer中对equals方法进行了重写,比较的的是两个对象的值是否相等,所以为true

        System.out.println("integer3==integer4: " + (integer3 == integer4));
        // false 自动装箱,两个非缓存对象,而是new出来的不同对象的引用进行比较,所以为false

        System.out.println("integer3>integer4: " + (integer3 > integer4)); 
        // false 自动拆箱,再比较大小 ,明显不成立

        System.out.println("integer3.equals(integer4): " + (integer3.equals(integer4)));
        // true Integer中对equals方法进行了重写,比较的的是两个对象的值是否相等,所以为true

        System.out.println("integer5==integer6: " + (integer5 == integer6)); 
        // false 两个不同的Integer对象引用的比较肯定为false

        System.out.println("integer5.equals(integer6): " + (integer5.equals(integer6)));
        // true  Integer中对equals方法进行了重写,比较的的是两个对象的值是否相等,所以为true

        System.out.println("integer1==int1: " + (integer1 == int1));
        // true  将Integer缓存对象拆箱后与int比较,即两个int类型进行比较,所以为true 

        System.out.println("integer1.equals(int1): " + (integer1.equals(int1)));
        // true  重写的equals方法中的方法参数是Object类型,不能传一个基本数据类型的参数进去,所以发生了自动装箱,
        //       int1被自动装箱为Integer类型,而Integer类型的最终父类是Object类型,然后就是两个Integer
        //       类型进行equals比较

        System.out.println("integer3==int2: " + (integer3 == int2));
        // true  Integer对象拆箱后与int比较,所以为true  

        System.out.println("integer3.equals(int2): " + (integer3.equals(int2)));
        // true  与倒3个输出原理相同

使用反编译查看

Integer integer1 = Integer.valueOf(100);
    Integer integer2 = Integer.valueOf(100);
    Integer integer3 = Integer.valueOf(200);
    Integer integer4 = Integer.valueOf(200);
    Integer integer5 = new Integer(100);
    Integer integer6 = new Integer(100);
    int int1 = 100;
    int int2 = 200;

    System.out.println("integer1==integer2: " + (integer1 == integer2));


    System.out.println("integer1.equals(integer2): " + integer1.equals(integer2));


    System.out.println("integer3==integer4: " + (integer3 == integer4));


    System.out.println("integer3>integer4: " + (integer3.intValue() > integer4.intValue()));


    System.out.println("integer3.equals(integer4): " + integer3.equals(integer4));


    System.out.println("integer5==integer6: " + (integer5 == integer6));


    System.out.println("integer5.equals(integer6): " + integer5.equals(integer6));


    System.out.println("integer1==int1: " + (integer1.intValue() == int1));


    System.out.println("integer1.equals(int1): " + integer1.equals(Integer.valueOf(int1)));




    System.out.println("integer3==int2: " + (integer3.intValue() == int2));


    System.out.println("integer3.equals(int2): " + integer3.equals(Integer.valueOf(int2)));

参考文章