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的场景)
手动编写简单迭代器示例
假设你写了一个基于数组的抽象集合子类:
立即学习“Java免费学习笔记(深入)”;
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 < size;
}
@Override
public E next() {
if (!hasNext()) throw new NoSuchElementException();
@SuppressWarnings("unchecked")
E item = (E) elements[cursor++];
return item;
}
};
}
@Override
public int size() {
return size;
}
}
注意 remove() 的语义与支持
Iterator.remove() 是可选操作。若你的集合允许结构性修改,应在迭代器中实现;否则应在 remove() 中抛出 UnsupportedOperationException。抽象类本身不强制要求支持,是否实现取决于业务需求和线程安全考虑。


















