iterator生命周期由hasnext()、next()、remove()三方法按序调用构成:hasnext()探路不改状态;next()推进并标记可删元素;remove()仅限紧接next()后一次调用,删除上一next()返回元素。

理解 Iterator 中 hasNext()、next() 和 remove() 的“生命周期”,关键在于把握它们在一次迭代过程中的**调用时序、状态依赖和状态变更**——不是指 JVM 生命周期,而是指这三个方法在单次迭代器对象使用过程中**何时可调、为何有效、为何失效**的逻辑链条。
hasNext() 是“探路者”,不改变状态
hasNext() 仅做判断:当前指针位置之后是否还有未访问元素。它不移动指针,也不消耗任何状态。每次调用都是独立的、幂等的。只要迭代器没被销毁或集合没被并发修改,它就始终反映“下一步能否走”。它本身没有生命周期约束,但它的返回结果直接决定 next() 是否能安全执行。
next() 是“推进器”,触发状态跃迁
next() 才真正启动生命周期流转:
- 调用前:指针停在某个位置(初始在第一个元素之前)
- 调用时:指针向后移动一位 → 返回该位置元素 → 记录“刚返回了这个元素”
- 调用后:指针落在新位置,同时内部标记“最近一次返回的元素已确定”
这个“标记”就是 remove() 能工作的前提。一旦 next() 成功返回,就进入一个短暂的“可删除窗口”;若紧接着没调 remove(),而是又调了一次 next(),前一次的删除资格就自动失效(旧标记被覆盖)。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
remove() 是“限时操作员”,强依赖上一步
remove() 不是独立动作,它是对 next() 所产生“上下文”的一次消费:
- 必须在至少一次成功
next()之后调用(否则抛IllegalStateException) - 只能删除
next()刚刚返回的那个元素(不是当前指针指向的,而是上一次next()返回的) - 同一
next()结果后,remove()只能调一次(重复调也抛IllegalStateException) - 调完
remove()后,指针位置不变,但内部“待删标记”清空,需再次next()才能获得新删除权限
整个生命周期是一条线性链:hasNext → next → (可选) remove → hasNext → next → …
这条链不能跳步,也不能回退。比如:
- 连续两次
next():第一次的元素失去被remove()的机会 - 先
hasNext()返回true,但不调next()就直接remove():非法 - 遍历结束(
hasNext()返回false)后还强行next():抛NoSuchElementException
这个链条一旦断裂(如异常、误序调用),迭代器就进入不可恢复的非法状态,后续行为未定义。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










