包装类存在是为了让基本类型具备对象特性,以适配泛型、集合、反射等要求引用类型的机制;提供工具方法、常量和明确语义;并支持空值(null)表达“无值”状态。

Java 面试中,基本类型与包装类看似简单,但常被问出深度——不是背概念,而是考你是否真正理解底层机制、设计意图和实际陷阱。回答要兼顾准确性、逻辑性和场景意识。
为什么要有包装类?不只是“为了用在集合里”
基本类型是栈上分配的纯数值,不具对象特性;而 Java 的泛型、集合、反射、序列化等机制都要求操作对象。包装类(如 Integer、Boolean)提供了“把基本值当对象用”的桥梁。更重要的是,它们封装了工具方法(如 Integer.parseInt()、Integer.bitCount())、常量(Integer.MAX_VALUE)和类型语义(比如 Boolean.TRUE 表示明确的真值,而非任意非零数)。
== 和 equals 的区别,关键看“是否缓存”
这是高频陷阱题。对 Integer、Character、Byte、Short、Long(仅限 -128 到 127),JVM 默认缓存其包装实例;new Integer(100) 每次新建对象,Integer.valueOf(100) 在范围内复用缓存对象。
- 用 == 比较两个通过 valueOf() 得到的 Integer(值在 -128~127):结果为 true
- 用 == 比较 new Integer(100) 和 Integer.valueOf(100):结果为 false
- 用 equals() 比较任意两个包装类:只要值相等就返回 true(会先判 null,再比数值)
所以结论很明确:**比较值,一律用 equals();判断是否同一对象才用 ==,且极少有合理场景需要这么做。**
自动装箱/拆箱的隐患,不止是空指针
编译器帮你隐式调用 valueOf() 和 xxxValue(),但容易埋雷:
- 空指针异常(NPE):如 Integer i = null; int j = i; —— 拆箱时调用 i.intValue() 报 NPE
- 性能损耗:循环中频繁装箱(如 list.add(i) 中 i 是 int)会创建大量短命对象
- 逻辑错误:Integer a = 1000, b = 1000; System.out.println(a == b); // false,若误以为 == 总能比值,结果出错
面试加分点:说清“缓存范围可配置”和“Boolean 的特殊性”
Integer 的缓存范围可通过 JVM 参数 -XX:AutoBoxCacheMax=N 扩大(如设为 200),但默认只缓存 -128~127;Boolean 只有两个实例(TRUE/FALSE),所以所有 Boolean.valueOf(x) 结果都可用 == 安全比较;Double 和 Float 不缓存(因为浮点精度问题使缓存意义不大)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











