自动装箱和拆箱

132 阅读2分钟

自动装箱(autoboxing)和拆箱(unboxing):将基本数据类型和包装类自动转换

自动装箱

基本数据类型处于需要对象的环境中时,会自动转为“对象”。 以Integer为例:

    Integer i = 5

编译器会自动转成:Integer i = Integer.valueOf(5),这就是Java的自动装箱

自动拆箱

每当需要一个值时,对象会自动转成基本数据类型,没必要再去显示调用inValue()、dooubleValue()等转型方法。

    Inteage i = Inteage.valueOf(5);
            int j = i;

编译器会自动转成:int j = i.intValue(); 这样的过程就是自动拆箱。

自动装箱/拆箱的本质是:

自动装箱与自动拆箱的功能是编译器来帮忙,编译器在编译时依据你所编写的语法,决定是否进行装箱或拆箱动作

例:

        //测试自动装箱和拆箱
        Integer x = 100; //编译器:Integer x = Integer.valueOf(100);装箱
        int y = x;//编译器:int y = x.valueOf();
        Integer z = null;
        //int z2 = z;       //编译器:int z2 = z.intValue();//结果:NullPointerException



    }

}

包装类的缓存问题

整型、char类型所对应的包装,在自动装箱时,对于-128~127之间的值会进行缓存处理,其目的是提高效率。

缓存原理为:如果数据在-128~127这个之间,那么在类加载时就已经为该区间的每个数值创建了对象,并将这256个对象存放到一个名为cache的数组中。每当自动装箱过程发生时(或者手动调用valueOf()时),就会先判断数据是否在该区间,如果在则直接获取数组中对应的包装类对象的引用,如果不在该区间,则会通过new调用包装类的构造方法来创建对象。

例:

//测试缓存问题
//自动装箱时,[-128~127]之间动数有缓存        
     Integer x1 = 100;//等于Inteage.valueOf(100)
     Integer x2 = 100;
     Integer x3 = 1000;
     Integer x4 = 1000;
     System.out.println(x1==x2);
     System.out.println(x3==x4);
     System.out.println(x1.equals(x2));
     System.out.println(x3.equals(x4));