Java中通用遍历方法应接收Iterable<T>参数并用hasNext()/next()安全循环,支持任意集合类型;若已有Iterator,须每次next前校验hasNext;删除操作仅限next后调用remove(),且不可重复调用。

Java 中 Iterator 本身是接口,不能直接“编写”它,但可以编写通用的遍历方法——即接收任意 Iterable 或 Iterator 的方法,用统一逻辑处理不同集合类型(如 ArrayList、HashSet、自定义容器等)。
1. 接收 Iterable<T> 是最通用的做法
几乎所有集合类(Collection 子类、数组包装类、Stream 收集结果等)都实现了 Iterable 接口,这是标准扩展点。
- 方法签名应为:
public static <T> void forEach(Iterable<T> iterable, Consumer<T> action) - 内部调用
iterable.iterator()获取迭代器,再循环处理 - 无需关心底层是数组、链表还是哈希表,也不需强制转换
2. 手动遍历 Iterator 的安全写法
如果已持有 Iterator<T>(比如从某个 API 返回),遍历时必须用 hasNext() + next() 组合,避免 NoSuchElementException:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- ❌ 错误:连续调用多次
next()而不检查hasNext() - ✅ 正确:每次
next()前都确认hasNext() == true - 示例:
while (iterator.hasNext()) {<br> T item = iterator.next();<br> // 处理 item<br>}
3. 支持 remove 操作需谨慎
若遍历中需要删除元素,只能通过 iterator.remove(),且必须在 next() 之后调用一次:
立即学习“Java免费学习笔记(深入)”;
- 不能在未调用
next()时调用remove()(抛IllegalStateException) - 不能连续调用两次
remove()(同样抛异常) - 若需条件删除,推荐用
removeIf(Predicate)(JDK 8+Collection接口提供)
4. 泛型与类型擦除的注意事项
泛型参数 <T> 在运行时不保留,所以通用方法无法判断具体类型,但编译期能保证类型安全:
- 传入
Iterable<String>,方法内T就是String,无需强转 - 避免使用原始类型(如
Iterable不带泛型),会丢失类型检查 - 若需处理多态(如
Iterable<? extends Number>),可用通配符限定上界

















