1、自动装箱与自动拆箱

(1)在 java中,数据类型分为两大类:基本类型和引用类型。

基本类型是数值不是对象,不能调用对象的toString()、hashCode ()、getClass()、equals()等方法。

(2)定义:拆箱和装箱使非人为的,自动装箱能在java中将基本类型转换为引用类型,比如int值转为Integer 对象,反之为拆箱。

(3)拆箱和装箱的基本类型:byte、short、 int、long、float、 double、boolean、char。分别装箱为Byte、 Short、Integer、Long 、Float、Double、 Boolean、Character。

自动装箱时编译器调用valueOf将原始类型值转换为对象,自动拆箱时编译器通过调用类似intValue()、doubleValue()等的方法将对象转换为原始类型值。

Integer intNum = 5;//已经自动将int类型转为Interger类型,程序运行的时候,编译器自动帮你转
Double doubleNum = 6.0;
Float floatNum = 6.0;
...

还有一些地方必须使用装箱的类型,比如HashMap和List等。

比如使用List的时候,就常到自动装箱和拆箱。
List<Integer> list = new ArrayList<>();
list.add(1);//自动将int值为1的数装箱为Integer类型
int firstValue = List.get(0);//获取 List下标为0的值,此时会将List里面的 引用对象 转为 值,

但是能不用拆箱装箱的地方,便不用拆箱装箱,因为这会增加 GC的压力、要尽量避免生成无用对象,也会影响效率,比如:

Integer sum = 0;
for(int i=0;i<5000;i++){
	sum += i;
}

在0-127的循环过程中是没有重新new一个对象的,而是直接返回缓存中的Integer对象,但是超过了int值的范围,则会自动装箱为包装类,此时会new一个新的对象,一直循环到5000的每一次都会new一个新的对象,增加GC的压力,耗费内存,降低性能。

(4)注意:还有如果要使用自动装箱的引用类型,必须要初始化对象,当我们进行一个基本类型和一个对象比较时,如果这个对象没有进行初始化或对象为 null,在自动拆箱过程中会抛出空指针异常。

(6) 那既然存在这么多风险,为何还要选择使用自动装箱拆箱呢?

因为一些数据结构只接受对象,不接受原始类型,比如 List.HashMap,等

还有一个很重要的就是泛型,具体的留到泛型再说。