Java抽象集合类不实现iterator(),由子类实现,通常通过内部类返回基于底层结构的Iterator,并需正确实现hasNext()和next();remove()为可选操作。

在 Java 中,抽象集合类(如 AbstractCollection、AbstractList、AbstractSet)本身不直接实现 iterator() 方法的具体逻辑,而是将该职责留给子类——但它们提供了标准的、可复用的迭代器实现方式。关键在于:抽象集合类通常通过内部私有类或匿名类返回一个符合 Iterator 接口规范的对象,该对象基于集合自身的数据结构(如数组、链表)进行遍历。
继承 AbstractCollection 并重写 iterator()
AbstractCollection 已声明 iterator() 为抽象方法,子类必须实现它。实现时一般封装底层存储结构的访问逻辑:
- 若底层是数组(如自定义数组列表),可返回一个遍历索引的内部迭代器
- 若底层是链表节点,可沿
next指针逐个推进 - 迭代器需维护当前状态(如当前索引或当前节点),并正确实现
hasNext()和next()
复用现有迭代器实现(推荐)
不必从零手写完整迭代器。Java 提供了便捷方式:
- 调用
Arrays.asList(array).iterator()(适合数组-backed 集合) - 对
ArrayList或LinkedList等已有集合委托调用其iterator() - 使用
StreamSupport.stream(spliterator(), false).iterator()(适用于已实现Spliterator的场景)
手动编写简单迭代器示例
假设你写了一个基于数组的抽象集合子类:
public class MyAbstractArrayCollection<e> extends AbstractCollection<e> {
protected final Object[] elements;
protected int size;
public MyAbstractArrayCollection(Object[] elements, int size) {
this.elements = elements;
this.size = size;
}
@Override
public Iterator<e> iterator() {
return new Iterator<e>() {
private int cursor = 0;
@Override
public boolean hasNext() {
return cursor <h3>注意 remove() 的语义与支持</h3>
<p><code>Iterator.remove()</code> 是可选操作。若你的集合允许结构性修改,应在迭代器中实现;否则应在 <code>remove()</code> 中抛出 <code>UnsupportedOperationException</code>。抽象类本身不强制要求支持,是否实现取决于业务需求和线程安全考虑。</p></e></e></e></e>
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











