自定义集合类支持for-each循环需实现iterable接口并提供返回新iterator实例的iterator()方法;迭代器须维护状态、实现hasnext()和next(),推荐用静态内部类避免内存泄漏。

要在自定义集合类中支持 for-each 循环,必须让该类实现 Iterable<t></t> 接口,并提供一个返回 Iterator<t></t> 的 iterator() 方法;这个迭代器可以是 Java 内置的(如基于数组或列表),也可以是完全自定义的——关键在于它要符合迭代器协议:能逐个访问元素、有明确的“是否还有下一个”判断、能安全地取出当前元素。
1. 自定义集合类需实现 Iterable
假设你写了一个简单的容器 MyList<e></e>,内部用数组存储元素。要让它可被 for (E e : myList) 遍历,第一步就是声明实现 Iterable<e></e>:
public class MyList<e> implements Iterable<e> {
private Object[] elements;
private int size;
// 构造、add、get 等方法略...
@Override
public Iterator<e> iterator() {
return new MyListIterator();
}
}
</e></e></e>
注意:iterator() 方法不能返回 null,否则遍历时会抛 NullPointerException;每次调用应返回一个**新创建的、独立状态**的迭代器实例(否则多个 for-each 同时使用会互相干扰)。
2. 编写专属迭代器类(静态内部类推荐)
迭代器本质是一个状态机:记录当前访问位置、判断边界、提供 next() 和 remove()。推荐用 private static class 实现,避免持有外部类的隐式引用(防止内存泄漏):
private class MyListIterator implements Iterator<e> {
private int cursor = 0; // 下一个要返回的元素下标
@Override
public boolean hasNext() {
return cursor
</e>
要点说明:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
cursor 初始为 0:表示“还没取过任何元素”,第一次
next()返回索引 0 的值 - next() 中先校验 hasNext():这是规范要求,不校验可能越界
-
类型转换需加 @SuppressWarnings:因泛型擦除,数组是
Object[],强制转E会有警告,但只要内部保证类型安全就可忽略 -
remove() 可选实现:若不支持删除,直接抛
UnsupportedOperationException即可
3. 支持 for-each 和显式迭代器用法
实现后,两种写法都生效:
MyList<string> list = new MyList();
list.add("a"); list.add("b");
// ✅ for-each 循环
for (String s : list) {
System.out.println(s);
}
// ✅ 手动使用迭代器
Iterator<string> it = list.iterator();
while (it.hasNext()) {
String s = it.next();
System.out.println(s);
}
</string></string>
注意:每次调用 list.iterator() 都得到一个全新迭代器,互不影响。比如两个 while 循环可同时遍历同一份数据。
4. 进阶:支持 remove() 的安全实现(可选)
如果想支持 it.remove(),需额外维护状态:
- 增加
lastRet字段记录上一次next()返回的索引 - 增加
expectedModCount防并发修改(类似 ArrayList 的 fail-fast 机制) -
remove()只允许在next()之后调用一次,且不能连续调两次
这部分逻辑较重,若非必要,保持 remove() 抛异常更简洁可靠。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










