减少循环内部开销需将不变计算移出循环:缓存list.size()和array.length、禁用循环内创建临时对象、剥离无关耗时操作、慎用增强for循环。

减少循环内部开销是提升大循环性能最直接有效的手段。核心思路是:把不随迭代变化的计算、对象创建、方法调用等,全部移出循环体;只保留真正依赖循环变量的逻辑。
提前计算边界和不变量
每次访问 list.size() 或 array.length 看似轻量,但在高频循环中会重复读取字段,JIT 虽可能优化,但显式缓存更可靠、更可控:
- 推荐写法:for (int i = 0, len = list.size(); i < len; i++) —— 变量作用域最小,无冗余读取
- 避免写法:for (int i = 0; i < list.size(); i++) —— 每次迭代都触发一次方法调用或字段读取
- 数组同理:for (int i = 0, n = arr.length; i < n; i++) 比 arr.length 直接写在条件里更稳定
禁止在循环内创建临时对象
频繁分配小对象会加剧 GC 压力,尤其在百万级迭代中极易引发停顿:
- 字符串拼接不用 +=,改用外部声明的 StringBuilder
- 格式化操作(如 SimpleDateFormat)不要在循环里 new,应复用或改为线程安全的 DateTimeFormatter
- 避免反复 new HashMap、ArrayList 等集合——若需每轮独立结构,考虑清空复用(clear())
剥离耗时或可预判的操作
任何与循环变量无关的耗时行为,都应前置或后置处理:
立即学习“Java免费学习笔记(深入)”;
- 远程调用、文件读写、数据库查询——绝不能放在循环体内,应批量聚合后一次性处理
- 复杂条件判断中,把开销大的子表达式(如正则匹配、对象方法调用)放在 && 后面,利用短路特性跳过执行
- 可提前计算的布尔结果,赋给局部 boolean 变量,避免重复求值
慎用增强 for 循环中的副作用
for-each 简洁安全,但隐含迭代器开销;若需修改集合或依赖索引,它反而增加负担:
- 遍历 ArrayList 且需索引 → 传统 for 更快(无 Iterator 对象分配)
- 遍历过程中要删除元素 → 必须用 Iterator.remove(),不能用 for-each 直接删
- 对原始数组或 int[]/double[] → 传统 for 避免自动装箱,性能优势明显



















