自动装箱是基本类型转包装类对象(如int→Integer,调用valueOf),拆箱则相反(调用intValue等);常见于赋值、集合、传参/返回、运算比较;需警惕==缓存陷阱、null拆箱NPE、循环中隐式装拆箱性能问题。

直接抓住核心逻辑和高频陷阱,不用死记语法糖细节。重点看三点:怎么转、在哪转、哪里容易翻车。
自动装箱和拆箱到底在干什么
装箱是把 基本类型(如 int)变成包装类对象(如 Integer),底层调用的是 Integer.valueOf(10) 这类静态方法;拆箱是反过来,把包装类对象转回基本类型,底层调用的是 intValue() 这类实例方法。
- 不是 new 出来的对象,而是编译器悄悄帮你插了代码
- 所有八种基本类型都有对应包装类,对应关系要一眼能对上(int→Integer、char→Character、boolean→Boolean 等)
- valueOf 方法有缓存机制:Integer 默认缓存 -128 到 127,Character 缓存 0–127,Boolean 只有 true/false 两个常量对象
哪些地方会自动触发装箱或拆箱
记住四个最常见场景,面试几乎全从这里出题:
- 赋值语句:Integer a = 10;(装箱),int b = a;(拆箱)
-
集合操作:List
list = new ArrayList(); list.add(5);(装箱),int x = list.get(0);(拆箱) - 方法传参与返回:void f(Integer i) { };f(42);(装箱);int g() { return new Integer(3); }(返回时拆箱)
- 运算和比较:Integer a = 5, b = 3; int c = a + b;(两个都拆箱再加);if (a == b)(注意:可能因缓存导致结果意外)
必须避开的三个典型坑
这些是面试官最爱问、也最容易答错的地方:
- == 比较陷阱:Integer i1 = 100, i2 = 100; System.out.println(i1 == i2); → 输出 true(缓存内复用同一对象);Integer i3 = 200, i4 = 200; System.out.println(i3 == i4); → 输出 false(超出缓存,各自 new)
- null 拆箱空指针:Integer a = null; int b = a; → 直接抛 NullPointerException,因为底层调用 a.intValue(),而 a 是 null
- 循环中隐式装拆箱性能问题:Integer sum = 0; for (int i = 0; i
一句话收尾提醒
装箱拆箱是语法糖,但糖吃多了会蛀牙——它藏在赋值、集合、运算背后,不显山不露水,却随时可能带来 NPE、缓存误判或性能抖动。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











