2026-01-03 12:55:47
Iterator与Iterable是Java集合框架中用于遍历元素的核心接口,但它们的定位和功能有显著区别。
一、核心区别功能定位
Iterator:提供单向遍历集合元素的能力,支持在遍历过程中删除元素(通过remove()方法)。
Iterable:作为集合的顶层接口,仅要求实现iterator()方法以生成Iterator对象,从而支持for-each循环。
遍历方式
Iterator:需显式调用hasNext()和next()方法,适合需要精细控制遍历过程的场景(如条件删除)。
Iterable:通过for-each语法隐式使用Iterator,代码更简洁,但无法直接删除元素。
删除操作
只有Iterator的remove()方法能安全删除当前元素;Iterable的for-each循环中删除元素会抛出ConcurrentModificationException。
适用条件:
适用条件:
Iterable并非双向迭代器
原文中“Iterable是双向迭代器”为错误表述。实际:
ListIterator(通过list.listIterator()获取)才支持双向遍历。
Iterable仅保证能生成Iterator,不涉及遍历方向。
Iterable的删除限制
通过for-each循环删除元素会触发快速失败机制(fail-fast),因为底层Iterator会检测到集合被意外修改。
自定义Iterable实现Iterable接口可让自定义类支持for-each循环:
class CustomCollection<T> implements Iterable<T> { private List<T> data = new ArrayList<>(); @Override public Iterator<T> iterator() { return data.iterator(); }}Iterator与Stream结合
List<String> list = Arrays.asList("A", "B", "C");Iterator<String> iterator = list.iterator();Stream<String> stream = StreamSupport.stream( Spliterators.spliteratorUnknownSize(iterator, 0), false);stream.filter(s -> !s.equals("B")).forEach(System.out::println);通过理解两者的分工,可以更灵活地选择合适的工具,提升代码的健壮性和可读性。