核心原则是优先使用基本类型而非包装类。自动装箱会引发对象爆炸,循环、集合、日志、三元运算等场景均需避免隐式装箱,改用int/long/boolean等,并借助SparseArray、fastutil等原始类型容器优化性能。

核心就一条:能用基本类型,绝不碰包装类。自动装箱不是语法糖,是对象爆炸的引信——尤其在高频路径上,一次装箱就是一次 new,百万次循环就是百万个短命对象,直接把 Eden 区塞爆。
循环里别让数字变成对象
累加、计数、索引、状态标记,只要不涉及 null 或泛型强约束,一律用 int/long/boolean 等基本类型。
- 把
Integer sum = 0改成int sum = 0 - 把
for (Integer i = 0; i 改成for (int i = 0; i - 避免
list.add(i)(i 是 int),这会隐式调用Integer.valueOf(i);超出 -128~127 范围就真 new 对象
集合操作换原始类型容器
泛型集合如 List 是装箱重灾区,每次 add/get 都在堆上钉一个对象。
- Android 场景:用
SparseArray替代HashMap,键直接存 int,零装箱 - 后端场景:引入
IntArrayList、IntObjectHashMap(来自 fastutil、Trove 等库),底层用原生数组存值 - 别写
Arrays.asList(1, 2, 3),它返回的是已装箱完毕的List
日志和字符串拼接要“脱箱”
"id=" + id + ", flag=" + flag 看似无害,编译后实际触发多次 Integer.valueOf() 和 Boolean.toString(),后者还会 new char[]。
- SLF4J:统一用占位符,
log.info("id={}, flag={}", id, flag),传基本类型不装箱 - Android Log:封装工具方法,内部调用
String.valueOf(id),绕过Integer.toString()的构造逻辑 - 高频日志点可复用
StringBuilder实例,避免每次 new
三元运算和方法返回别踩缓存陷阱
Integer status = condition ? 200 : null 是典型雷区:200 不在缓存范围,每次执行都 new Integer(200),哪怕只赋给局部变量,对象已诞生。
- 能用基本类型接收就不用包装类:
int status = condition ? 200 : -1 - 接口需表达“可能为空”语义?用
Optional显式建模,而不是靠包装类兼职空值标记 - 检查所有
public Integer getXxx()方法,若业务上绝不可能为 null,直接改为int
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











