装箱和拆箱

210 阅读2分钟

作用:免去开发者手动转换的工作

装箱

自动将基本数据类型转换为包装器类型

 //自动装箱
 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的能力,更抽象,解决业务问题编程效率高。

参考:www.cnblogs.com/wang-yaz/p/…