自动装箱和拆箱是 Java 的一种语法糖,由编译器在编译阶段自动完成,底层是通过调用包装类的方法实现的。
-
自动装箱 :把基本数据类型自动转换成对应的包装类,编译器会自动调用
包装类.valueOf()方法。 -
自动拆箱 :把包装类自动转换成对应的基本数据类型,编译器会自动调用
xxxValue()方法。 -
核心优化点 :为了提升性能,Java 对常用范围的包装类做了缓存机制 ,比如 Integer 默认缓存
-128 ~ 127之间的值,这个范围内的装箱会直接复用缓存对象,不会新建对象。 -
注意点 :包装类为
null时进行自动拆箱,会抛出空指针异常。
Byte、Short、Integer、Long 这四个包装类规则完全一致:自动装箱调用 valueOf (),自动拆箱调用 xxxValue ();统一缓存 -128 ~ 127,超出范围创建新对象,== 比较返回 false。
举例:
Long 装箱调用 Long.valueOf(),拆箱调用 longValue(),缓存范围 -128~127 ,超出范围会创建新对象,== 比较会返回 false。
Byte、Short、Integer、Long 统一缓存 -128~127,超出范围新建对象;== 比较只在缓存内相等,超范围必不等。