能用基本类型的地方,别用包装类;高频计算和循环中必须用int/long/double等基本类型,避免自动装箱开销,成员变量仅在需null语义时才选integer等包装类。

性能调优中,基本类型和包装类的取舍核心就一条:能用基本类型的地方,别用包装类。
高频计算和循环体里必须用基本类型
自动装箱是隐形性能杀手。比如在 for 循环中向 List<integer></integer> 添加 int 值,每次 add(i) 都会触发 Integer.valueOf(i),生成新对象。10 万次循环可能产生 10 万个 Integer 实例,每个占 24 字节(对象头+字段+对齐填充),而 int 本身只占 4 字节。
- 累加、坐标运算、计数器、中间变量全部声明为
int、long、double - 避免写
Integer sum = 0;,改用int sum = 0; - 集合操作如需遍历计算,优先用
IntStream或提前解包成数组处理
只有必须用对象语义时才选包装类
泛型、集合、反射、方法参数/返回值需要统一引用类型时,包装类不可替代。但要注意使用方式:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 用
Integer.valueOf(x)替代new Integer(x),小范围值(-128 ~ 127)可复用缓存对象 - 避免在循环内反复调用
intValue()拆箱,先提取为局部基本变量再运算 - 成员变量若允许为
null(如数据库映射字段),才考虑包装类;否则用基本类型 + 明确默认值更安全高效
内存与执行路径差异要心里有数
基本类型变量存在栈上,读写快、无 GC 压力;包装类实例在堆上分配,涉及对象创建、逃逸分析、可能进入老年代,还可能触发 Minor GC。
- 局部变量几乎总是优先基本类型
- 方法参数如果是纯数值逻辑(如计算接口),收参用
int,调用方负责拆箱 - 不要为了“看起来统一”把所有数字都改成
Integer,尤其在工具类或数学库中
特殊场景的折中办法
有些框架或 API 强制要求包装类型,这时可在关键路径做显式优化:
- 从集合批量读取时,用
stream().mapToInt(Integer::intValue).sum()替代逐个拆箱 - 自定义高性能容器(如
IntArrayList)绕过泛型限制,内部用int[]存储 - 用
OptionalInt、OptionalLong替代Optional<integer></integer>,减少一层包装
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










