Iterator遍历关键在于理解游标逻辑与安全边界:初始指针位于首元素之前,需用hasNext()判断、next()移动并取值,删除必须用it.remove()且须在next()后调用。

掌握 Iterator 迭代器遍历,关键不在死记方法名,而在于理解它的“游标逻辑”和“安全边界”。它不是工具类,而是一种访问契约——你按规则走,它就帮你绕开底层差异和并发风险。
弄清迭代器的初始位置和移动机制
调用 collection.iterator() 后,迭代器指针并不指向第一个元素,而是停在“第一个元素之前”的位置(类似索引 -1)。这决定了两个动作必须配合:
- hasNext():只查“后面有没有”,不移动指针;
- next():先移动指针到下一个位置,再把那个位置的元素交给你。
所以不能跳过 hasNext() 直接调用 next(),否则空集合或遍历末尾会抛 NoSuchElementException。
遍历写法要形成固定节奏
标准 while 循环结构不是约定俗成,而是强制保障安全的最小单元:
立即学习“Java免费学习笔记(深入)”;
- 每次循环开头用 hasNext() 判断是否还能走;
- 确认能走之后,立刻用 next() 拿元素并推进指针;
- 处理元素(打印、计算、条件判断等)放在 next() 之后,不在条件里嵌套 next()。
错误示范:if (it.next().equals("x")) —— 每次判断都取一个新元素,会漏掉、错位,且无法二次使用该元素。
删除操作必须守三原则
Iterator 的 remove() 是遍历时唯一安全的删除方式,但有硬性约束:
- 必须在调用过一次 next() 之后才能调用;
- 两次 next() 之间,最多只能调用一次 remove();
- 绝对不能混用集合自身的 remove()(如
list.remove()),否则触发 ConcurrentModificationException。
典型安全写法:
while (it.hasNext()) {
String s = it.next();
if ("待删项".equals(s)) {
it.remove(); // 此时删的是刚刚 next() 拿到的那个
}
}
注意不同集合的遍历表现差异
Iterator 不保证顺序,具体行为取决于集合实现:
- ArrayList / LinkedList:按插入顺序,正向可预测;
- HashSet:无序,每次运行可能不同(底层哈希桶分布决定);
- TreeSet:按自然序或比较器排序;
- LinkedHashSet:按插入顺序;
如果业务依赖顺序,别只看“能遍历”,要确认你用的集合类型是否天然支持所需顺序。


















