包装类
char --- character
int --- Integer
其他基本类型的包装类均为基本类型首字母大写
为啥要使用包装类
因为有的地方需要基本类型有对象的一些特征属性,所以使用包装类来让基本类型具有对象特征。
自动拆箱和自动装箱
自动拆箱 包装类 -> 基本类型
Integer a = 123;
int b = a;
int b = a 的本质是 int b = a.intValue();
包装类拆箱统一是使用 基本类型Value()方法来拆箱
自动装箱 基本类型 -> 包装类
上文中 Integer a = 123就是自动装箱
本质是 Integer a = Integer.valueOf(123);
包装类.valueOf()方法来实现自动装箱。
什么场景会使用到自动拆装箱
1. 将基本类型放入集合类中
2. 包装类型和基本类型比较大小
3. 包装类的计算
4. 三则运算符的使用 如果 i 为null 这里就会报错
boolean flag = true;
Integer i = 0;
Integer j = 1;
int k = flag ? i : j;
//int k = flag ? i.intValue() : j.intValue();
5. 函数参数和返回值
自动装箱与缓存
Integer 的 128现象
Integer.valueOf()中使用了IntegerCache方法缓存了一个-128 到 127的Integer数组,valueOf会判断大小是否在这个缓存数组中,如果有就直接将引用指向数组中地址,没有就new一个新的Integer对象。所以
public class Integer缓存的测试 {
public static void main(String[] args) {
Integer a = 127;
Integer b = 127;
System.out.println(a == b);
a= -128;
b= -128;
System.out.println(a == b);
a=200;
b=200;
System.out.println(a == b);
}
}
这个代码输出就是
true
true
false
同样,如果你使用new Integer()来创建对象,也不会通过缓存池引用所以和直接自动装箱的对象用 == 比较也会返回false。
基本类型和包装类的选择
1. 类的属性和方法的返回值推荐使用包装类,因为包装类的默认值为null比较符合业务环境
2. 局部变量推荐使用基本类型