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中的包装类提供了相应的实现方法。