不能一概而论谁更快,关键看集合类型和操作:arraylist用普通for循环快10%~20%,linkedlist必须用iterator,hashmap遍历应选entryset()而非keyset()+get()。

不能一概而论谁更快,关键看集合类型和具体操作——ArrayList 上普通 for 循环通常快 10%~20%,LinkedList 上 Iterator 反而明显更优。
ArrayList:索引访问占优势
ArrayList 底层是数组,get(i) 是 O(1) 随机访问。普通 for 循环直接按索引取值,无额外对象开销,JIT 编译后还能内联优化。
- 增强 for 和 Iterator 实际都基于内部 Itr 类,多一层方法调用和状态维护
- 若循环体简单(如只读取、不打印、不 toString),JIT 可能逃逸分析消除 Itr 对象,但不如 for 稳定
- 实测百万元素:for 循环平均比 Iterator 快约 15%,差异在大型集合中更显著
LinkedList:Iterator 是唯一合理选择
LinkedList 的 get(i) 是 O(n) 操作——每次都要从头遍历链表。普通 for 循环会退化为 O(n²) 时间复杂度。
- Iterator.next() 是 O(1),保持指针连续推进,全程 O(n)
- 增强 for 循环底层就是 Iterator,性能与显式 Iterator 几乎一致
- 10 万元素 LinkedList 中,for 循环耗时可能达迭代器的 10 倍以上
Map 遍历:别掉进 keySet()+get() 的坑
对 HashMap 或 LinkedHashMap,遍历时若用 keySet() + get(),每次 get 都要重新哈希、寻址、处理冲突,开销巨大。
- 正确做法是用 entrySet().iterator() 或增强 for 遍历 Map.Entry
- JDK 17 下 10 万 entry 测试:entrySet() 比 keySet()+get() 快约 2.3 倍
- 注意 ConcurrentHashMap 的 entrySet() 是弱一致视图,不保证反映最新修改
测试要靠谱:避开常见干扰
手写 System.nanoTime() 容易被 JIT 优化成空循环,得出错误结论。
- 务必用 JMH 做微基准测试,至少预热 5 轮
- 关掉分层编译干扰:-XX:-TieredStopAtLevel
- 循环体内避免日志、toString()、异常构造等高开销操作
- 对比时保持 JVM 参数、数据规模、GC 状态一致
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











