包装类面试核心是自动装箱/拆箱机制、缓存策略(integer等-128~127)、==与equals区别(==比引用,equals比值但需防null)、null导致的npe风险及arraylist不能直接存int的根本原因(泛型擦除要求object)。

Java 包装类面试题,核心是考你是否真正理解“自动装箱/拆箱”背后的机制、缓存策略、空指针风险,以及和 ==、equals 的关系。光背结论容易翻车,得结合代码场景讲清楚为什么。
包装类缓存机制怎么答才到位
别只说“Integer 缓存 -128 到 127”,要说明这是 JVM 规范允许的优化,且仅对 Integer、Short、Byte、Character、Long 有效(Boolean 也缓存 true/false,但范围固定)。重点强调:缓存对象复用发生在 自动装箱 过程中,不是所有构造都走缓存。
- Integer i1 = 100; Integer i2 = 100; → i1 == i2 为 true(走缓存)
- Integer i3 = new Integer(100); Integer i4 = 100; → i3 == i4 为 false(new 总是新建对象)
- Integer i5 = 200; Integer i6 = 200; → i5 == i6 为 false(超出默认缓存范围)
== 和 equals 在包装类里怎么选
== 比的是引用(地址),equals 比的是值(内容),但 equals 有前提:必须确保对象不为 null。面试官常故意设 null 场景来考察边界意识。
- 推荐写法:a != null && a.equals(b),或用 Objects.equals(a, b)(自动判空)
- 反例:Integer x = null; x.equals(5) → 抛 NullPointerException
- 注意:两个包装类用 == 比较,只有在确定都在缓存范围内且非 null 时才安全
自动装箱/拆箱的坑怎么避开
装箱本质是调用 valueOf(),拆箱是调用 xxxValue()。问题多出在隐式转换 + null 上。
- Integer a = null; int b = a; → 拆箱时触发 NullPointerException
- 集合里存包装类(如 List
),遍历时用基本类型接收,可能 NPE - 运算中混用:Integer a = 1; Integer b = null; Integer c = a + b; → 拆箱阶段崩
- 建议:明确区分场景——需要判空或可能为 null,就用包装类;做计算或传参,优先用基本类型或提前非空校验
为什么 ArrayList 不能存 int
泛型擦除后,ArrayList 实际存储的是 Object 数组,而 int 是基本类型,无法直接作为 Object 存入。JVM 会自动装箱成 Integer 对象,所以语法上允许,但本质仍是对象引用。
- int[] arr = {1,2,3}; // 堆外连续内存,高效
- ArrayList
list = Arrays.asList(1,2,3); // 堆内多个 Integer 对象,有额外开销 - 高频数值操作(如大量数学计算)考虑用专门库(如 Eclipse Collections)或原始类型集合替代
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











