循环效率瓶颈常源于循环体内重复计算,应将不变值(如list.size())提至循环外;否则对linkedlist等集合调用size()可能触发遍历,增加开销。

Java 循环结构的效率瓶颈,往往不是循环本身,而是循环体内反复执行的“看似无害”的计算。真正拖慢性能的,常常是那些本可在循环外一次性完成的操作。
把不变的值提前算好
每次迭代都调用 list.size() 或 array.length,表面看只是读个属性,但对某些集合(如 LinkedList)或代理类,size() 可能触发遍历;即使对 ArrayList,JVM 也未必总做内联优化。反复访问就是实打实的开销。
- 写成 for (int i = 0; i —— 每次都查一次大小
- 改成 for (int i = 0, n = list.size(); i —— 仅查一次,变量 n 作用域也刚好限于该循环
把耗时操作坚决移出循环
如果循环里调用了数据库查询、文件读取、复杂数学运算或任何带 I/O 或大量 CPU 消耗的方法,而它的结果在整个循环中都不变,那它就属于典型的“错放”。
- 错误示范:for (int i = 0; i
- 正确做法:int base = computeExpensiveValue(); for (int i = 0; i
善用增强 for 循环与迭代器
当只需遍历元素、无需索引时,增强 for 循环(for-each)不仅代码简洁,而且对数组和大多数集合,JVM 会生成更高效的字节码,避免了手动索引管理及边界检查冗余。
- 数组遍历优先用:for (int value : array) { ... }
- 需要安全删除元素时用:for (Iterator
it = list.iterator(); it.hasNext(); ) { String s = it.next(); if (shouldRemove(s)) it.remove(); }
嵌套循环注意内外层规模关系
两层嵌套时,若外层迭代次数远大于内层,CPU 缓存容易失效,分支预测失败率升高。把“小规模”逻辑放外层、“大规模”放内层,能显著改善局部性。
- 低效:for (int i = 0; i
- 更优:for (int j = 0; j (前提是逻辑允许交换顺序)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











