Iterator平滑检索需严格遵循三步:先hasNext()判断,再next()获取并推进,最后remove()安全删除;while循环天然匹配其状态驱动逻辑,支持条件中断与过滤剔除,避免越界、空指针及并发修改异常。

用 Iterator 配合流程控制实现不依赖下标的平滑检索,核心在于把“移动指针”和“判断存在”解耦,避免越界、空指针或异常中断。它不是靠索引跳转,而是靠状态驱动——每次只关心“有没有下一个”,再决定“要不要取”“要不要停”“要不要删”。
明确三步固定节奏
Iterator 的操作必须严格遵循顺序逻辑,否则容易触发 IllegalStateException 或 NoSuchElementException:
- 先调 hasNext() 判断当前位置之后是否还有元素
- 只有返回 true 时,才调 next() 拿出当前元素,并自动推进指针
- 若需删除刚拿到的这个元素,立刻在本次循环内调 remove(),且只能调一次
用 while 实现稳定单向推进
while 循环天然匹配 Iterator 的“有则继续、无则退出”语义,比 for 更安全、更直观:
- 不预设长度,不计算 size,完全无视集合底层是 ArrayList 还是 HashSet
- 每轮只做一件事:检查 → 获取 → 处理(可含删除),逻辑清晰不嵌套
- 即使集合为空,
hasNext()直接返回 false,循环体一次都不执行,不会报错
检索中支持条件中断与安全剔除
平滑检索不只是“全量遍历”,更包括“找到即停”或“边找边清”。这时流程控制要配合业务判断:
- 查找首个匹配项:在
next()后立即用 if 判断,满足就 break,无需走完整个集合 - 批量过滤删除:必须用
it.remove(),绝不用collection.remove(),否则抛 ConcurrentModificationException - 需要跳过某些元素?不调
next()就不推进,下一轮hasNext()仍检查同一位置(但实际 Iterator 不支持回退,所以跳过 = 忽略本次,继续下一轮)
避免常见流程陷阱
几个看似微小、实则高频出错的操作细节:
- 不能在未调 next() 前 remove():比如刚拿到 it 就 it.remove() → IllegalStateException
- 不能对同一 next() 结果连调两次 remove():remove() 后再次 remove() → IllegalStateException
- 不能在 hasNext() 为 false 后还调 next():直接抛 NoSuchElementException
-
遍历完的迭代器不可复用:想重来?必须重新调
collection.iterator()

















