应优先使用基本类型而非包装类以避免自动装箱拆箱;在循环和高频计算中必须用int等基本类型,如for(int i=0;i

直接用基本类型代替包装类,能从根源上避开自动装箱与拆箱。这不是要你放弃泛型或集合,而是清楚在哪该“退一步用原始值”,在哪该“主动控制转换”。
循环和高频计算中一律使用基本类型
在 for 循环计数、累加、索引访问等场景,包装类会反复触发装箱/拆箱,生成大量临时对象。
- ❌ 避免:
Integer sum = 0; for (Integer i = 0; i —— 每次+=都经历intValue()+valueOf() - ✅ 改为:
int sum = 0; for (int i = 0; i —— 纯栈运算,无对象创建 - 对 long / double 等大类型更明显:
Long对象头+引用开销更大,实测耗时可能高出 5–10 倍
集合读写时切断隐式转换链
声明 List 没问题,但怎么用,决定是否真高效。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- ❌ 避免在循环里写:
for (int i = 0; i —— 每次get()返回Integer,再自动拆箱 - ✅ 推荐:
list.stream().mapToInt(Integer::intValue).sum()—— JVM 可跳过中间对象,走原始流路径 - 若集合只读且量大,考虑用
IntList(Eclipse Collections)或TIntArrayList(Trove),彻底绕过泛型擦除带来的强制装箱
方法参数与返回值明确类型边界
包装类传入方法后一旦参与运算或条件判断,就可能在你没注意的地方悄悄拆箱。
- 拆箱前必判空:比如
int value = obj != null ? obj.getValue() : 0;,别依赖三元表达式自动处理(obj.getValue()为 null 时仍会 NPE) - 对外提供 API 时,优先接收
int而非Integer;如需支持 null 语义,用OptionalInt或显式文档说明 - 日志占位符传参时,确认变量类型:
log.info("count: {}", count)中若count是int,SLF4J 不会装箱;若是Integer,则会触发
比较与缓存使用保持清醒
别让 == 和缓存范围误导你的逻辑判断。
- 永远不用
==比较两个包装类的值,哪怕数值在 -128~127 内——这依赖实现细节,不可靠 - 统一用
Objects.equals(a, b),它内部处理 null 安全,语义清晰 - 需要复用对象时,主动调用
Integer.valueOf(n),而不是new Integer(n)(已废弃)——前者有缓存,后者每次都 new
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










