自动装箱(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));