java中iterator规范使用需遵循“先判后取、单步调用、删用迭代器自身方法”:遍历时必须用hasnext()判断后再调用next();删除只能用it.remove()且须紧随next()之后;迭代器不可复用,多线程应选线程安全集合的专用迭代器。

Java 中 Iterator 的规范使用,核心是“先判后取、单步调用、删用迭代器自身方法”,避免并发修改异常和状态错乱。
遍历前必须用 hasNext() 判断
每次调用 next() 前,必须确保 hasNext() 返回 true。直接调用 next() 而不检查,一旦游标越界就会抛 NoSuchElementException。
- ✅ 正确写法:用 while (it.hasNext()) { String s = it.next(); ... }
- ❌ 错误写法:在循环外或未校验时连续调用 it.next()
- 注意:hasNext() 不移动指针,next() 才移动;一次 next() 对应一个元素,不可跳过或重复调用
删除操作只能用 iterator.remove()
遍历时若需删除当前匹配项,必须调用迭代器的 remove() 方法,绝不能调用集合本身的 remove() 或 add() —— 否则触发 ConcurrentModificationException。
- ✅ 安全删除:it.remove()(前提是刚执行过一次 it.next())
- ❌ 危险操作:list.remove(item)、set.add(x)、map.put(k,v) 等任何集合结构变更
- 限制条件:remove() 只能调用一次,且必须紧跟在 next() 之后;连续两次 remove() 会抛 IllegalStateException
遍历中不要复用或重置迭代器
Iterator 是一次性游标对象,遍历结束后不可重复使用。若需再次遍历,必须重新调用 collection.iterator() 获取新实例。
- ❌ 错误示例:it = list.iterator(); while(it.hasNext()) {...} // 第二轮仍用 it
- ✅ 正确做法:第二次遍历前写 it = list.iterator();
- 增强 for 循环(for-each)本质就是自动获取并使用新 Iterator,适合只读场景,但无法中途安全删除
多线程环境下需谨慎
标准 Iterator 是 fail-fast 的,检测到集合被其他线程修改即快速失败。如需并发遍历,应选用线程安全集合配套的迭代器:
- CopyOnWriteArrayList.iterator():返回快照式迭代器,遍历时允许写操作
- ConcurrentHashMap.keySet().iterator():弱一致性迭代器,不抛 CME,但可能漏读或重复读
- 普通 ArrayList/HashSet 的 Iterator 在多线程读写混合场景下不适用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











