四、自动拆装箱
1.定义
装箱:将基本数据类型转换成包装类型的过程
拆箱:将包装类型装换成基本数据类型的过程
2.原理
自动装箱都是通过包装类的valueOf()方法来实现,自动拆箱通过包装类对象的xxxValue()来实现.
3.应用场景
场景一 、将基本数据类型放入集合类
List<Integer> li = new ArrayList<>;
for(int i=1;i<50;i++){
li.add(i);
}
反编译:
List<Integer> li = new ArrayList<>;
for(int i=1;i<50;i++){
li.add(Integer.valueOf(i));
}
场景二、包装类和基本类型的大小比较
Integer a=1;
System.out.println(a==1?"等于":"不等于");
boolean bool=false;
System.out.println(bool?"真":"假");
反编译:
Integer a=1;
System.out.println(a.IntValue==1?"等于":"不等于");
boolean bool=false;
System.out.println(bool.booleanValue?"真":"假");
包装类与基本数据类型进行比较运算,先将包装类拆箱成基本数据类型,然后比较.
场景三、包装类型的运算
对Integer对象进行四则运算
Integer i = 10;
Integer j = 20;
System.out.println(i+j);
反编译:
Integer i = Integer.valueOf(10);
Integer j = Integer.valueOf(20);
System.out.println(i.intValue() + j.intValue());
两个包装类型之间的运算,会被自动拆箱成基本类型.
场景四、三目运算符的使用
boolean flag = true;
Integer i = 0;
int j = 1;
int k = flag ? i : j;
在使用三目运算符时,会发生自动拆箱
1.表达式1和表达式2的值只要有一个时基本数据类型
2.表达式1和表达式2的值类型不一致,会强制拆箱升级成表示范围更大的那个类型
反编译
boolean flag = true;
Integer i = Integer.valueOf(0);
int j = 1;
int k = flag ? i.intValue() : j;
System.out.println(k);
如果三目运算符的表达式在自动拆箱的过程中为null.会发生自动拆箱导致的空指针异常.
场景五、函数参数与返回值
//自动拆箱
public int getNum(Integer num){
return num;
}
//自动装箱
public Integer getNum(int num){
return num;
}