作用:免去开发者手动转换的工作
装箱
自动将基本数据类型转换为包装器类型
//自动装箱
Integer total = 99;
执行上面那句代码的时候,系统为我们执行了:
Integer total = Integer.valueOf(99);
缓存
public static Integer valueOf(int i) {
return i >= 128 || i < -128 ? new Integer(i) : SMALL_VALUES[i + 128];
}
在缓存范围就从缓存拿,不在就new。
拆箱
自动将包装器类型转换为基本数据类型。
//自动拆箱
int totalprim = total;
执行上面那句代码的时候,系统为我们执行了:
int totalprim = total.intValue();
各封装类的缓存范围
- Integer、Short、long缓存了[128,127)对象。内部是一个长度256的数组
- Character缓存码点c<128的字符
- Boolean 缓存Ture和False对象
- 浮点型包装器类型是直接创建对象的
String没有缓存。是用final char[]存储的。
运算
1、一个基础数据类型与封装类进行==、+、-、*、/运算时 会将封装类进行拆箱,对基础数据类型进行运算。
2、equals
@Override
public boolean equals(Object o) {
return (o instanceof Integer) && (((Integer) o).value == value);
}
例如Integer.equals,相等条件是类型&&value相等
性能
内存方面
装箱操作会创建对象,频繁的装箱操作会消耗许多内存,影响性能,所以可以避免装箱的时候应该尽量避免。
存储方面
- 基本数据类型是直接存值
- 引用类型是根据引用找到对象的内存位置,再根据对象实例找到写一个内存空间,产生更多的IO
运用方面
- 引用类型计算性能比基本数据类型差,
- 但是引用类型具备generic的能力,更抽象,解决业务问题编程效率高。