最高效的for循环需缓存不变量、选对遍历方式、避开运行时陷阱:将size()等提到循环外;数组/ArrayList用增强for,LinkedList或需索引时用传统for;边删边遍历必须用Iterator.remove();嵌套循环优先降维预处理。

最高效的 for 循环写法,核心不是“炫技”,而是让 JVM 少做无谓工作、让代码逻辑更贴近数据访问模式。关键在三点:缓存不变量、选对遍历方式、避开运行时陷阱。
缓存循环边界和重复计算
每次循环都调用 list.size() 或 array.length 看似无害,但编译器不一定能完全优化,尤其在复杂集合或自定义类中。把它们提到循环外,是零成本高回报的优化。
- ❌ 低效写法:for (int i = 0; i
- ✅ 优化写法:int n = list.size(); for (int i = 0; i
- 同理,像 if (x > collection.size() / 2) 这类表达式,应提前算好 int threshold = collection.size() / 2
按场景选对遍历形式
没有“万能最快”,只有“最匹配”:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 只读遍历数组或 ArrayList → 用增强 for(for (T t : list)),JVM 通常会内联为高效索引循环,代码简洁且安全
- 需要索引、修改元素、或遍历 LinkedList → 用传统 for,避免增强 for 在 LinkedList 上的 O(n) 遍历开销
- 要边遍历边删除 → 必须用 Iterator.remove(),增强 for 直接删会抛 ConcurrentModificationException
嵌套循环优先降维,而非硬优化
两层 for 套着查数据,性能瓶颈往往不在循环本身,而在算法结构:
立即学习“Java免费学习笔记(深入)”;
- ❌ 双重遍历比对两个 List:for (a : list1) for (b : list2) if (a.equals(b)) ...
- ✅ 改成单次预处理:Set<T> set2 = new HashSet<>(list2); for (T a : list1) if (set2.contains(a)) ...
- 外层循环次数少?把它放外面——比如 for (smallList) { for (bigList) } 比反过来快,减少内层初始化和判断次数
避免循环体内创建对象和调用慢方法
每轮都 new 对象或调用远程/IO/反射方法,等于给 GC 和线程调度反复添堵:
- 对象复用:把 new StringBuilder() 移到循环外,循环内用 setLength(0)
- 方法提取:把耗时逻辑(如格式化、加密)抽成独立方法,必要时加缓存,别让它卡在循环里反复执行
- 局部变量优先:用 int len = arr.length 替代反复访问 arr.length,避免字段读取开销(尤其在老版本 JVM 或非 final 字段上)


















