for-each循环是iterator的语法糖,底层调用iterator()及hasnext()/next();iterator支持remove()等安全修改,for-each中修改集合会抛concurrentmodificationexception;for-each适合只读遍历,iterator更灵活可控;性能依集合类型而异,arraylist中普通for最快,linkedlist中for-each和iterator更优。

语法写法和底层机制不同
for-each 循环是语法糖,写起来简洁:for (String s : list);而 Iterator 需要显式获取并控制:Iterator
遍历时能否修改集合是核心区别
Iterator 允许在遍历中安全删除当前元素:it.remove(),这是它设计的合法操作;
- 用 for-each 循环时若调用 list.remove(...),会触发 ConcurrentModificationException
- 因为 for-each 依赖的迭代器内部维护了 expectedModCount,而集合自身的 remove() 会改变 modCount,两者不一致就抛异常
- 即使只是添加元素,也会破坏迭代器状态,同样不被允许
适用场景和灵活性差异
for-each 适合只读遍历,代码清晰、不易出错,日常开发中占大多数场景;
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 无法获取当前索引,也不能跳过或回退元素
- 不能在循环中决定是否继续(比如满足条件就 break,这没问题;但想动态跳过下一项就不行)
- Iterator 支持更多控制:可配合 ListIterator 双向遍历、添加元素、获取索引位置(it.nextIndex())
- 当需要统一处理多种集合类型(如 List、Set、自定义容器),用 Iterator 更易抽象和复用
性能表现依集合类型而异
对 ArrayList:普通 for 循环最快(索引随机访问 O(1)),for-each 和 Iterator 性能接近,略慢 5–10%;
对 LinkedList:for-each 和 Iterator 明显更快(顺序访问 O(1)),而普通 for 循环因反复调用 get(i) 变成 O(n²),应避免;
- HashSet、TreeSet 等无序/有序集合不支持索引,只能用 for-each 或 Iterator
- 三者时间复杂度都是 O(n),但实际耗时受内部结构影响显著
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










