JDK自动装箱与拆箱机制

Java中的自动装箱(Autoboxing)和自动拆箱(Unboxing)是指基本数据类型与对应包装类之间的自动转换机制,从Java 5开始引入。


1.基本概念

Java中有8种基本数据类型,每种都有对应的包装类。

基本数据类型 包装类
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean

1.自动装箱(基本类型→包装类)

int a = 10;
Integer b = a;  // 自动装箱

编译器会将其转换为类似下面的代码:

int a = 10;
Integer b = Integer.valueOf(a);

自动装箱主要通过包装类的valueOf()方法实现。

2.自动拆箱(包装类→基本类型)

Integer a = 10;
int b = a;  // 自动拆箱

编译器会将其转换为类似下面的代码:

Integer a = Integer.valueOf(10);
int b = a.intValue();

不同包装类对应不同的方法,例如:

  • Integer.intValue()
  • Long.longValue()
  • Double.doubleValue()
  • Boolean.booleanValue()

自动拆箱主要通过包装类的基本类型转换方法实现。

2.自动装箱与拆箱的底层原理

从JDK实现角度看,需要区分两个层面:

层面 原理
语法层面 编译器识别基本类型与包装类之间的转换
字节码层面 编译后的字节码通常包含valueOf()和xxxValue()等方法调用
运行时层面 包装对象由JVM执行相关代码,缓存可能复用已有对象
性能层面 JIT可能进行内联、逃逸分析等优化,但不能假定所有装箱都没有成本

严格来说,自动装箱与拆箱是Java语言规范定义的编译期转换规则,不是JDK运行时自动识别变量并随意转换。JDK中的包装类提供了相应的实现方法。