java包装类是基本类型与引用类型的桥梁,本质为final类,封装对应基本类型字段并存于堆内存;自动装箱调用valueof()(含-128~127缓存),拆箱调用xxxvalue(),null拆箱抛npe,==比较易出错。

Java 中的包装类是连接基本数据类型和引用类型的桥梁。它让 int、boolean、char 这些轻量级的基本类型,能以对象形式参与面向对象的编程场景,比如放进集合、作为泛型参数、调用方法等。自动拆装箱就是编译器在背后悄悄帮你完成“基本类型 ↔ 包装类”转换的过程,不用手动写 Integer.valueOf() 或 intValue()。
包装类的本质是什么
每种基本类型都有唯一对应的包装类:byte→Byte、int→Integer、boolean→Boolean、char→Character 等。它们都是 final 类,不可继承,内部封装一个同名的基本类型字段(如 private final int value;)。包装类对象存于堆内存,而基本类型变量直接存在栈上——这是两者最根本的内存差异。
- Integer 不等于 int:前者是对象,后者是值;前者可为 null,后者总有默认值(如 0、false)
- 包装类提供了实用方法:
parseInt()、toString()、compareTo()等,基本类型本身没有这些能力 - 所有包装类都继承自
java.lang.Number(数值类)或Object,支持多态与统一处理
自动装箱是怎么发生的
当你把一个基本类型赋值给对应包装类变量,或传入只接受对象的上下文(如集合 add 方法),编译器会自动调用 valueOf() 方法。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
Integer i = 100;→ 实际执行Integer i = Integer.valueOf(100); -
List<long> list = new ArrayList(); list.add(5L);</long>→ 自动转为list.add(Long.valueOf(5L)); -
valueOf()并非每次都新建对象:对 Integer、Short、Byte、Character、Boolean,-128 到 127 范围内的值会复用缓存对象;超出则 new 出新实例
自动拆箱是怎么发生的
当你把包装类变量用于需要基本类型的场景(如算术运算、比较、赋值给基本类型变量),编译器自动调用 xxxValue() 方法提取原始值。
-
Integer i = 42; int x = i + 1;→ 先i.intValue()得到 42,再做加法 -
if (flag) { ... }(flag 是 Boolean 类型)→ 自动调用flag.booleanValue() - 注意空指针风险:若包装类变量为
null,拆箱时会抛NullPointerException
== 比较时的陷阱与真相
用 == 判断两个包装类是否相等,结果取决于是否指向同一对象,而非数值是否相同。
-
Integer a = 100, b = 100; System.out.println(a == b);→ true(缓存复用) -
Integer c = 200, d = 200; System.out.println(c == d);→ false(各自 new) -
Integer e = 100; int f = 100; System.out.println(e == f);→ true(e 自动拆箱后比值) - 安全做法:数值比较一律用
equals(),或先确保非 null 再拆箱
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










