Iterator和Iterable的区别?
请解释Java中Iterator和Iterable两个接口的区别和关系,说明for-each循环的底层实现原理,以及为什么需要同时存在这两个接口。
回答
专业代码师
Iterable接口:
- 位于java.lang包
- 定义方法:
Iterator<T> iterator() - 实现了Iterable的类可以使用for-each循环
- 可以有多个默认方法(forEach、spliterator等)
Iterator接口:
- 位于java.util包
- 核心方法:hasNext()、next()、remove()(默认方法)
- 用于遍历集合的迭代器对象
- 维护遍历状态(当前位置)
关系:
- Iterable是「可迭代」的标记,Iterator是「迭代器」的实现
- 集合类实现Iterable来取得Iterator
- for-each循环编译后本质是调用iterator()获得Iterator,然后用hasNext()+next()循环
为什么分离:
- 职责分离:集合本身只负责提供迭代器,迭代逻辑封装在Iterator中
- 多次遍历:每次增强for循环都调用iterator()创建新的Iterator,支持多次独立遍历
- 不同迭代策略:同一个集合可以有不同的iterator()方法实现不同类型的遍历
ListIterator:Iterator的子接口,支持双向遍历和修改。