自定义集合实现迭代器需提供iterator()方法(java)或__iter__和__next__方法(python),核心是封装状态与遍历逻辑,注意空集合处理、修改检测及可重复使用性等设计问题。

在自定义集合中实现 Iterator,核心是让集合类提供一个能返回迭代器对象的方法(通常是 iterator()),而这个迭代器对象要实现 Iterator 接口(Java)或对应语言的迭代协议(如 Python 的 __iter__ 和 __next__)。关键不在于“能不能”,而在于“怎么封装好内部状态和遍历逻辑”。
Java 中实现 Iterator 的三步走
以自定义的简单数组列表 MyArrayList 为例:
-
集合类实现
Iterable接口:只需重写iterator()方法,返回一个迭代器实例; -
单独定义内部迭代器类(推荐静态或私有):实现
Iterator<e></e>,维护当前索引、检查越界、支持hasNext()/next()/remove(); -
迭代器需持有对集合的弱引用或只读访问:避免修改集合结构时产生并发异常(如
ConcurrentModificationException),可加modCount检查机制。
Python 中用魔法方法支持 for 循环
Python 不需要显式实现接口,只要定义两个方法即可被 for、list() 等识别:
-
__iter__(self):返回一个迭代器对象(可以是self自身,也可以是新创建的对象); -
__next__(self):返回下一个元素,遍历完抛出StopIteration; - 常见写法是让集合本身同时充当迭代器(即支持
__iter__返回self,并在__next__中维护self._index),但要注意多次迭代时需重置状态——更安全的做法是每次__iter__都返回新迭代器实例。
注意边界与一致性
无论哪种语言,都要处理几个实际问题:
- 空集合时
hasNext()或__next__()行为要明确(比如首次调用就抛异常或返回None); - 迭代过程中集合被修改,是否允许?Java 的
fail-fast是默认策略,Python 通常不检查,但用户代码应避免边遍历边增删; - 如果集合支持双向遍历(如
ListIterator),还需额外实现hasPrevious()、previous()等方法。
不复杂但容易忽略
真正难的不是写几行代码,而是想清楚:迭代器该不该可重复使用?是否线程安全?是否懒加载?这些设计选择会影响 API 的健壮性和易用性。从最简可用开始,再按需增强,比一开始就堆砌功能更可靠。











