Iterator 是 Java 集合框架中用于遍历集合(List、Set 等)的工具,它提供了访问集合中每个元素的统一接口,避免直接操作集合的实现细节。
Iterator的基本使用和方法
基本方法
hasNext():检查是否还有元素可供迭代。next():返回下一个元素。remove():从集合中删除当前迭代到的元素(可选操作,可能会抛UnsupportedOperationException)。
基本使用


常见用法
1.遍历并删除元素
Iterator 的 remove() 方法可以安全地删除集合中的当前元素,避免并发修改异常(ConcurrentModificationException)。


2.与forEachRemaining配合


3.在不同集合中使用
Iterator 可以用于多种集合类型,例如 Set 和 Map


4.ListIterator的使用
ListIterator是Iterator的扩展,提供了额外的功能
- 支持双向遍历(
hasPrevious()和previous())。 - 可以添加或修改元素(
add()和set())。


常见报错
不可修改集合类
一些集合类的实现本身是不可修改的,因此不支持 Iterator.remove() 操作。
- 不可变集合:
Collections.unmodifiableList()List.of()、Set.of()、Map.of()(Java 9+)
- 只读视图:
Arrays.asList()返回的集合是一个固定大小的视图。


解决方案:
- 如果需要支持删除操作,使用可变集合,如
ArrayList:
List<String> list = new ArrayList<>(Arrays.asList("Apple", "Banana", "Cherry"));
错误调用remove()
在 Iterator.remove() 中,必须在调用 next() 之后调用 remove(),否则会抛出异常
import java.util.*;
public class Main {
public static void main(String[] args) {
List<String> list = new ArrayList<>(Arrays.asList("Apple", "Banana", "Cherry"));
Iterator<String> iterator = list.iterator();
iterator.remove(); // 抛出 IllegalStateException,因为还未调用 next()
}
}
正确使用:
while (iterator.hasNext()) {
iterator.next();
iterator.remove();
}
集合类不支持迭代器的修改
某些集合的实现提供了只读迭代器。例如:
java.util.ConcurrentSkipListSet的迭代器不支持remove()。
解决方案:
检查集合实现类的文档,确认是否支持修改操作。如果不支持,可能需要将集合复制到一个可变集合中进行操作。
在增强for中使用remove()
增强for底层隐式的使用了Iterator,而且这个Iterator不提供remove()方法
如果需要删除元素,必须手动获取 Iterator。
错误用法:
List<String> list = new ArrayList<>(Arrays.asList("Apple", "Banana", "Cherry"));
for (String item : list) {
if (item.startsWith("B")) {
list.remove(item); // 抛出 ConcurrentModificationException
}
}
正确用法:
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
if (iterator.next().startsWith("B")) {
iterator.remove();
}
}
并发修改导致的异常
如果在一个线程中使用 Iterator 遍历集合,同时另一个线程对集合进行了修改,也可能引发异常。
解决方案:
- 使用线程安全的集合,如
CopyOnWriteArrayList或ConcurrentHashMap。 - 或者对集合操作加锁。



















