1.什么是自动装箱、拆箱:
自动装箱就是自动将原始数据类型转换成对应对象类型,反之则是自动拆箱。装箱:int -> Integer,double->Double...
2.自动装箱拆箱要点:
自动装箱时,编译器会自动调用ValueOf()将原始数据转为对应的对象,自动拆箱时,编译器会调用intValue()等接口,将对象转为原始数据类型。
3.何时发生自动装箱、拆箱:
在Java中,方法调用和接收方法返回值时,会发生自动装箱和拆箱。
ArrayList<Integer> list = new ArrayList<>();
list.add(3);
list.add(4);
// -------------- 以上为自动装箱 ---------------
int a = list.get(0); // 此处为自动拆箱
4.自动装箱的弊端:
在循环体中自动装箱,会创建多余的对象,影响程序性能:
Integer sum = 0;
for(int i = 0; i < 5000; i++) {
sum += 1;
}
上面的代码中,可以看成是 sum = sum + 1; 但是,“+”法操作并不适用于Integer类型,在这个程序中,编译器会先将Integer类型的数据转为int类型,进行“+”法过后,再将int类型数据转为Integer类型,大概为:int s = sum.intValue() + 1;Integer sum = new Integer(s);所以,在这个程序中,我们在循环体中使用自动拆箱,装箱时,会产生4000多个多余的对象,这大大增加了Java GC的工作量,性能也会受到影响。
5.重载与自动装箱拆箱:
在调用重载方法时不会发生自动装箱、拆箱操作的。