2026-10-30 16:25:18
Iterator和Iterable是Java集合框架中用于遍历的核心接口,它们通过定义统一的方法规范,为不同集合类型提供了灵活的遍历机制。
一、核心概念解析Iterator接口
核心方法:
hasNext():检查是否存在下一个元素(返回boolean)。
next():返回下一个元素并移动指针(若元素不存在则抛出NoSuchElementException)。
remove()(可选):删除最近一次next()返回的元素(需在调用next()后立即使用)。
特点:
单向遍历:只能从前往后移动指针。
快速失败(Fail-Fast):若在遍历过程中集合被修改(非Iterator自身的remove()方法),会抛出ConcurrentModificationException。
Iterable接口
核心方法:
iterator():返回一个Iterator实例。
意义:
使集合类(如ArrayList、HashSet)能够支持for-each循环(语法糖,编译后实际调用iterator())。
允许自定义遍历逻辑(例如通过内部类实现Iterator)。
无法直接修改集合结构(如删除元素),否则可能引发ConcurrentModificationException。
仅适用于实现了Iterable的集合。
支持在遍历时安全删除元素(通过iterator.remove())。
更灵活,可自定义遍历行为(如过滤、转换)。
解耦遍历逻辑
集合类只需实现Iterable,无需关心具体遍历方式;Iterator封装了指针移动和元素访问的细节。
多态遍历
任何实现Iterable的类均可通过iterator()适配不同遍历需求(如自定义Iterator实现逆序遍历)。
安全并发控制
Fail-Fast机制强制要求遍历时保持集合稳定,避免并发修改导致数据不一致。
并发修改异常
错误示例:for (String s : list) { if (s.equals("B")) list.remove(s); // 抛出ConcurrentModificationException}
解决方案:使用Iterator.remove()或CopyOnWriteArrayList(线程安全集合)。
性能考量
对于简单遍历,for-each和Iterator性能接近;Stream适合复杂操作但可能有额外开销。
自定义Iterator
通过实现Iterable,可为自定义类(如链表、树)提供遍历支持:class MyCollection implements Iterable<String> { @Override public Iterator<String> iterator() { return new MyIterator(); // 返回自定义Iterator实现 }}
仅需读取元素 → for-each或Stream。
需删除/复杂操作 → 显式使用Iterator。
通过理解这两个接口的设计,可以更灵活地处理集合遍历场景,并避免常见陷阱。