Java包装类将基本类型封装为对象以支持面向对象操作,如集合存储、泛型使用、反射等;对应关系为int→Integer、boolean→Boolean等;自动装箱/拆箱简化转换但需注意缓存与空指针陷阱。

Java包装类是把基本数据类型(如int、boolean等)封装成对象的工具,让它们能参与面向对象操作——比如放进集合、作为泛型参数、调用方法或支持空值语义。
为什么需要包装类?
Java中基本类型不是对象,不能直接用于需要Object的场景。例如ArrayList只接受对象,不能存int;泛型不支持基本类型,List
每个基本类型对应一个包装类:
- int → Integer
- double → Double
- boolean → Boolean
- char → Character
- long → Long
- short → Short
- byte → Byte
- float → Float
自动装箱与拆箱:简化写法背后的机制
从Java 5开始,编译器支持自动装箱(autoboxing)和拆箱(unboxing),让基本类型和包装类之间的转换更自然:
立即学习“Java免费学习笔记(深入)”;
Integer i = 100; // 自动装箱:int → Integer
int x = i; // 自动拆箱:Integer → int
List
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
注意:自动转换发生在编译期插入隐式调用(如Integer.valueOf()、intValue()),但运行时有陷阱——比如==比较可能因缓存机制返回意外结果。
理解valueOf()与new的区别
推荐使用静态工厂方法valueOf()而非new创建包装类实例:
- Integer.valueOf(100) 会复用-128到127范围内的缓存对象(JLS规定),节省内存
- new Integer(100) 每次都新建对象,即使值相同,==比较也返回false
- 其他包装类(如Byte、Short、Character)也有类似缓存策略;Long、Double等仅对valueOf()做优化,但不强制缓存
所以判断相等应始终用equals(),而非==(除非明确比较引用且了解缓存边界)。
空值安全与常见陷阱
包装类可为null,这是它比基本类型更灵活的地方,但也引入NPE风险:
- Integer i = null;
int x = i; // 运行时报NullPointerException - 在Stream、Optional、数据库映射(如JDBC ResultSet.getObject())中常遇到null包装类,需提前判空
- 避免在条件表达式中直接拆箱:if (i > 0) 可能崩溃,应先写if (i != null && i > 0)
设计API时,优先考虑是否真需要null语义;若只是临时替代基本类型,用原始类型更安全高效。

















