Java中基本类型与包装类型的装箱(自动调用valueOf)和拆箱(自动调用xxxValue)由编译器隐式完成,但需注意Integer等缓存机制及null导致的NullPointerException风险。

装箱:基本类型 → 包装类
当把一个基本类型值赋给对应包装类型的变量时,编译器会自动插入 valueOf() 调用:
-
Integer i = 100;等价于Integer i = Integer.valueOf(100); -
Boolean b = true;等价于Boolean b = Boolean.valueOf(true); - 其他如
Double d = 3.14;实际调用Double.valueOf(3.14)
注意:valueOf() 有缓存机制。比如 Integer.valueOf(n) 对 -128 到 127 的整数返回缓存对象,超出范围则新建对象——这直接影响 == 判断结果。
拆箱:包装类 → 基本类型
当把包装类型变量赋给基本类型变量,或参与算术/比较运算时,编译器自动调用 xxxValue() 方法:
-
int x = i;等价于int x = i.intValue(); -
double sum = d1 + d2;(d1、d2 是 Double)→ 先调d1.doubleValue()和d2.doubleValue(),再相加 -
if (b)(b 是 Boolean)→ 实际执行b.booleanValue()
关键风险:若包装类型变量为 null,拆箱会立即抛出 NullPointerException。例如 Integer i = null; int x = i; 运行时报错。
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
哪些类型支持自动装箱/拆箱
仅以下 8 对严格配对的基本类型与包装类支持:
byte ↔ Byteshort ↔ Shortint ↔ Integerlong ↔ Longfloat ↔ Floatdouble ↔ Doublechar ↔ Characterboolean ↔ Boolean
String、数组、自定义类等不参与该机制,不能和基本类型自动互转。
典型场景与实用提醒
这些写法都会触发自动转换:
- 集合操作:
List<Integer> list = new ArrayList<>(); list.add(42);→ 42 自动装箱 - 方法传参:接收
Integer参数的方法可直接传int;反之亦然 - 运算表达式:
Integer a = 1, b = 2; int s = a + b;→ a、b 先拆箱再相加
建议:
- 比较值时统一用
equals(),避免因缓存导致的==误判 - 避免在循环中频繁装箱/拆箱,尤其处理大量数值时,考虑用基本类型数组替代 List
- 从集合或方法返回获取包装类型时,先判空再拆箱,或使用
Objects.requireNonNull()明确意图

















