核心是减少对象创建,高频路径优先用基本类型替代包装类;自动装箱/拆箱引发堆分配、GC和缓存未命中;循环累加、集合存储、方法参数等场景应避免无意义包装,明确语义并按需选用原始类型容器或Optional。

核心是减少对象创建,尤其在高频路径上用基本类型替代包装类。自动装箱本质是编译期调用 valueOf() 创建对象,拆箱则是调用 xxxValue() 方法;性能损耗不来自语法糖本身,而来自反复分配堆内存、触发 GC 和缓存未命中。
循环计算优先用基本类型
累加、计数、索引等场景,直接声明 int、long、double,别用 Integer、Long、Double。
- 错误写法:
Long sum = 0L; for (int i = 0; i —— 每次+=都触发一次拆箱 + 一次装箱,新建一个Long对象 - 正确写法:
long sum = 0L; for (int i = 0; i —— 全程栈上操作,无对象开销 - 实测差异:千万级循环中,
Long版本耗时可达long版本的 10 倍以上
集合操作按需选原始类型容器
大量数据存取时,List 等泛型集合会为每个元素执行装箱,造成显著 GC 压力。
- 高频数值集合(如统计、指标、批量计算):改用
IntArrayList(Eclipse Collections)、MutableIntList或IntStream处理 - 简单场景可接受:用
int[]替代ArrayList,避免泛型擦除+装箱双重开销 - 若必须用标准集合,至少避免在循环内反复
add(i);可先收集到数组再批量构建,或使用Arrays.asList()配合基本类型数组(注意它不支持增删)
方法参数与返回值明确语义,避免无意义包装
包装类应承载“可空”或“需对象特性”的语义,不是为了写起来顺手。
- 入参非空且必填:用
int、long,让编译器强制约束;不要写成Integer id再立刻id.intValue() - 返回可能为空的数值:用
OptionalInt、OptionalLong,比Integer更安全、更轻量(不涉及缓存和 null 拆箱风险) - DTO/VO 字段:数据库允许 NULL 的字段才用
Integer;主键、版本号、状态码等业务上非空字段,坚持用int并设默认值(如private int status = 0;)
日志与调试场景不必强优化,但要警惕隐式装箱
低频操作对性能影响微乎其微,重点在于不引入意外 NPE 或混淆语义。
- 日志拼接如
log.info("count={}", count)中count是int,SLF4J 会自动处理,无需改成Integer - 避免在字符串拼接中写
"value=" + someInteger—— 若someInteger为 null,会输出"value=null",看似无害,实则掩盖空值问题;建议统一用占位符或显式判空 - 调试打印可用
Objects.toString(obj, "n/a")替代直接拼接,兼顾可读性与健壮性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











