Iterator接口的作用是提供安全、统一、按需遍历集合的能力,支持遍历中删除元素而不抛ConcurrentModificationException,并实现集合与遍历逻辑的解耦。

Iterator 接口的作用,一句话说清:它让你能安全、统一、按需地遍历任意集合,同时支持在遍历中途删元素,而不会崩(即不抛 ConcurrentModificationException)。
这不是“另一个for循环语法糖”,而是集合与遍历逻辑彻底解耦的设计——你写一次遍历逻辑,就能套用在 ArrayList、HashSet、LinkedHashMap 甚至你自己写的集合上。
为什么不能直接 for 循环删元素?
这是新手最常栽跟头的地方。看这个典型错误:
Listlist = new ArrayList<>(Arrays.asList("A", "B", "C", "D")); for (String s : list) { if ("B".equals(s)) { list.remove(s); // ⚠️ 危险!立刻触发 ConcurrentModificationException } }
原因:for-each 底层确实用的是 Iterator,但你绕过它、直接调 list.remove(),就破坏了迭代器内部的修改计数器(modCount),导致“快照失效”。
立即学习“Java免费学习笔记(深入)”;
- ✅ 正确做法:必须用
iterator.remove()—— 它会同步更新计数器 - ❌ 错误做法:任何直接调集合自身
remove()、add()、clear()的操作 - ⚠️ 注意:
remove()是可选操作,某些只读集合(如Collections.unmodifiableList())会抛UnsupportedOperationException
Iterator 和 ListIterator 到底该用谁?
普通 Iterator 只能单向前进;ListIterator 是它的增强版,专为 List 设计,支持双向 + 修改。
- 需要从后往前遍历?→ 用
ListIterator:hasPrevious()+previous() - 想边遍历边在当前位置插入新元素?→
ListIterator.add()(Iterator不支持) - 想改当前元素值?→
ListIterator.set()(Iterator没这能力) - 但注意:
ListIterator只能用于List实现类(ArrayList、LinkedList),Set或Map视图不支持
示例:正向走到第2个元素后,插一个 "X" 并改前一个为 "B-mod"
Listlist = new ArrayList<>(Arrays.asList("A", "B", "C")); ListIterator lit = list.listIterator(); lit.next(); lit.next(); // 移到 "C" lit.add("X"); // 在 "C" 后插入 → [A, B, C, X] lit.previous(); // 回退到 "C" lit.set("C-mod"); // 改成 "C-mod" → [A, B, C-mod, X]
Map 怎么用 Iterator?别漏掉 entrySet()
Map 本身不实现 Iterable,所以不能直接 map.iterator()。你得先选视图:
- 遍历 key?→
map.keySet().iterator() - 遍历 value?→
map.values().iterator() - 遍历 key-value 对(最常用,避免二次查表)?→
map.entrySet().iterator()
错误写法(性能差+无法获取 key):
for (String value : map.values()) { ... } // ❌ 丢了 key,且可能重复查 map.get(key)推荐写法:
Iterator> iter = map.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry = iter.next(); System.out.println(entry.getKey() + "=" + entry.getValue()); // 如需删除该键值对:iter.remove(); ✅ 安全 }
迭代器不是万能的:3 个容易被忽略的硬限制
很多人以为拿到 Iterator 就一劳永逸,其实它很“脆弱”:
-
Iterator是一次性对象:用完即废,不能reset()或重用;要再遍历?必须重新调collection.iterator() - 线程不安全:即使集合本身是线程安全的(如
ConcurrentHashMap),其Iterator也不保证强一致性(它是弱一致的快照) - 不能跨集合复用:
ArrayList的Iterator和LinkedList的实现完全不同,没有通用“迭代器池”概念
真正复杂的场景(比如高并发下既要遍历又要删),别硬扛 Iterator,考虑 CopyOnWriteArrayList 或 ConcurrentHashMap 自带的并发安全遍历机制。










