java自定义集合支持iterator遍历的核心是实现iterable接口并提供iterator()方法返回iterator实例;推荐用私有内部类实现iterator,需重写hasnext()、next()及可选remove();可维护modcount实现fail-fast机制,或委托底层jdk集合的iterator()。

Java 中让自定义集合类支持 Iterator 遍历,核心是实现 Iterable 接口并提供一个返回 Iterator 实例的 iterator() 方法。这个 Iterator 可以是内置实现(如基于数组或链表),也可以是自己编写的内部类。
实现 Iterable 接口
自定义集合类必须实现 Iterable<e></e> 接口,其中 E 是元素类型。这是 for-each 循环能识别它的前提:
- 接口要求你实现
iterator(): Iterator<e></e>方法 - 该方法返回一个能按序访问集合中每个元素的对象
- 不实现
Iterable,编译器会报错:「can't be iterated with for-each loop」
提供 Iterator 实例(推荐用内部类)
最清晰、安全的方式是写一个私有内部类实现 Iterator<e></e>,封装遍历状态(如当前索引、是否可删除等):
- 重写
hasNext():判断是否还有未访问元素(常依赖当前下标与 size 比较) - 重写
next():返回当前元素,并将指针后移;若越界应抛NoSuchElementException - 可选重写
remove():实现安全删除(需记录上一次调用next()的位置)
例如,一个简单数组-backed 的集合:private class MyIterator implements Iterator<string> {<br> private int cursor = 0;<br> public boolean hasNext() { return cursor public String next() {<br> if (!hasNext()) throw new NoSuchElementException();<br> return elements[cursor++];<br> }<br>}</string>
注意并发修改与 fail-fast 行为
标准集合的迭代器在检测到集合被外部修改时会快速失败(抛 ConcurrentModificationException)。如果你希望保持这种行为,需维护一个 modCount(修改计数器):
- 每次 add/remove 操作递增
modCount - 迭代器创建时记录初始
expectedModCount - 每次调用
next()或remove()前校验两者是否一致
这并非强制要求,但能提升调试体验和行为一致性。
也可复用现有 Iterator(适合简单场景)
如果底层已用 ArrayList、LinkedList 等 JDK 集合存储数据,可直接委托其 iterator():
public Iterator<e> iterator() { return dataList.iterator(); }</e>- 省去手写逻辑,但失去对遍历过程的完全控制(比如想跳过 null 元素、加过滤条件等)
需要定制逻辑时,仍建议手写 Iterator 子类。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











