普通for循环遍历arraylist最快,因其直接索引访问、无iterator对象创建、无方法调用开销且易被jvm优化;增强for底层仍用迭代器,遍历时修改会抛concurrentmodificationexception。

用 普通 for 循环(基于索引) 遍历 ArrayList 最高效,避免用增强 for 或迭代器在频繁增删场景下产生隐式开销。
为什么普通 for 循环最快?
ArrayList 底层是数组,支持 O(1) 随机访问。普通 for 循环直接通过 get(i) 拿元素,没有额外对象创建或接口调用开销。
- 不创建
Iterator对象,无内存分配 - 跳过
hasNext()和next()的方法调用与边界检查(增强 for 内部仍会做) - JVM 容易对这种简单索引循环做优化(如范围检查消除)
增强 for 循环(for-each)的隐患
语法简洁,但背后仍是迭代器机制。在以下情况会暴露问题:
- 遍历时修改集合(如
remove()),抛ConcurrentModificationException - 调试时无法直接看到当前索引,需额外变量计数
- 某些老版本 JDK 或特定 JIT 场景下,迭代器的
checkForComodification()带来轻微开销(虽通常可忽略,但在高频循环中累积可见)
什么时候必须用迭代器?
仅当需要边遍历边安全删除元素时才推荐:
- 用
iterator.remove()是唯一安全的删除方式 - 避免先收集待删索引再倒序删——多一次遍历,且易出错
- 示例:
for (Iterator<string> it = list.iterator(); it.hasNext(); ) { String s = it.next(); if (s.isEmpty()) it.remove(); }</string>
别踩这些“看似合理”的坑
不要在 for 循环里反复调用 list.size() —— 虽然 ArrayList 的 size() 是 O(1),但每次调用仍有方法入口开销,且阻碍 JVM 优化。
- ✅ 正确写法:
for (int i = 0, size = list.size(); i - ❌ 避免写法:
for (int i = 0; i - 也不要为“省代码”把
get(i)提前存成局部变量再用——除非真有性能瓶颈,否则得不偿失
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











