循环中应使用基本类型而非包装类以避免装箱拆箱开销:循环变量、计数器、累加器等必须声明为int、long、double等原始类型,禁用Integer等参与循环控制与计算。

在循环中防范自动装箱与拆箱的性能损耗,核心是杜绝包装类参与循环控制和计算逻辑。每次装箱都意味着一次 Integer.valueOf() 调用和对象创建,拆箱则调用 intValue()——看似简洁,实则在高频循环里迅速累积 GC 压力和 CPU 开销。
循环变量和计数器必须用基本类型
索引、步进、终止条件、累加器等所有参与循环运算的变量,一律声明为 int、long、double 等原始类型。
- ❌ 错误写法:用
Integer做循环变量或累加器i++
- ✅ 正确写法:
int sum = 0;<br>for (int i = 0; i <br>→ 零对象创建,纯栈上整数运算
集合操作避免泛型包装类的高频装箱
向 List 连续添加大量 int 值时,每个 add(i) 都会触发一次装箱。
- 对小规模数据(如配置、状态枚举),影响可忽略;对万级及以上批量操作,应考虑替代方案
- 优先使用原生基本类型集合库,例如:
–IntArrayList(来自 Eclipse Collections)
–IntList(来自 Trove 或 FastUtil)
–IntStream配合终端操作(如sum()、reduce()),内部避免中间包装对象 - 若必须用
List,可预先用Arrays.asList()批量构造,而非逐个add
警惕隐式拆箱引发的空指针和缓存陷阱
循环中若涉及可能为 null 的包装类变量,直接用于计算或比较极易崩溃;同时,== 比较在循环内误用会因整数缓存范围(-128~127)导致逻辑不一致。
- 拆箱前务必判空:
if (obj != null) { int val = obj; /* 安全拆箱 */ } - 值比较统一用
.equals()或先转基本类型再比:Objects.equals(a, b)或a != null && b != null && a.intValue() == b.intValue() - 避免在循环内写
if (x == 128)判断包装类——改用x != null && x == 128(此时x是int)或Objects.equals(x, 128)
临时中间值也别用包装类
循环体内定义的中间变量,比如取模结果、位运算输出、数组下标偏移等,同样适用“能用 int 就不用 Integer”原则。
- ❌
Integer offset = i % 5;→ 多余装箱 - ✅
int offset = i % 5;→ 直接复用栈空间,无 GC 干扰 - 尤其注意 Lambda 表达式中捕获的变量:若外部是
Integer,内部运算仍会反复拆箱;应提前解包为基本类型再传入
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











