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
。 - 或者对集合操作加锁。