选iterator还是for循环取决于集合类型、是否需修改集合、是否依赖索引:arraylist用for最快,linkedlist和无索引集合(如hashset、hashmap)必须用iterator;遍历时删除元素只能用iterator.remove();增强for简洁但无索引且不支持break/continue。

选 Iterator 还是 for 循环,关键看三点:集合类型、是否需要修改集合、是否依赖索引。不是越新越好,也不是越熟越对,而是谁更贴合当前场景。
看集合底层结构——数组型还是链表型?
ArrayList 是连续内存,支持 O(1) 索引访问,for 循环直接 list.get(i) 最快;LinkedList 每次 get(i) 都要从头遍历,O(n) 复杂度,用 for 循环遍历 10 万个元素可能慢 10 倍以上。这时 Iterator 或增强 for(本质也是 Iterator)才是合理选择。
HashSet、TreeSet、HashMap 这些不支持索引的集合,压根没有 get(int index) 方法,只能用 Iterator 或增强 for。Map 尤其要注意:遍历时优先用 map.entrySet().iterator(),别写 for (K k : map.keySet()) { V v = map.get(k); }——后者每次 get 都要重新哈希+寻址,实测慢 2.3 倍左右。
看操作需求——要不要边遍历边删元素?
如果要在遍历中删除元素,必须用 Iterator 的 remove() 方法。增强 for 和普通 for 循环里调用 collection.remove() 会触发 ConcurrentModificationException。
- Iterator.remove() 是安全的,它在 next() 后立即生效,且只删上一次返回的元素
- 注意:不能连续调两次 remove(),也不能没调 next() 就调 remove(),否则抛异常
看代码可读性与控制粒度——要简洁还是要精细?
单纯打印或累加?增强 for 最清爽:for (String s : list) { System.out.println(s); }。
需要在循环中判断条件跳过、提前退出、或做多次 next() 操作?Iterator 的 while + hasNext()/next() 更灵活。比如跳过前两个元素再处理,或者每取两个元素做一次合并,这种逻辑用增强 for 写起来反而绕。
还要注意:增强 for 无法获取当前索引,如果业务逻辑明确需要下标(如“第 5 个元素特殊处理”),那就得回归普通 for 循环。
性能不是玄学——小集合无所谓,大集合看结构
100 个元素以内,三种方式差异可忽略;但到 10 万级,结构就决定一切:
- ArrayList:for 循环最快,比 Iterator 快约 10%–20%
- LinkedList:Iterator 稳定 O(n),for 循环退化成 O(n²)
- HashMap:entrySet().iterator() 是标准写法,keySet()+get() 是隐形坑
另外,list.forEach()(Iterable 默认方法)性能接近手写 for,但不支持 break/continue;Stream.forEach() 单纯遍历反而更慢,除非你真要用 filter/map/collect 链式操作。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











