迭代器
Java中的Iterator(迭代器)是集合框架中用于遍历容器元素的统一接口,提供了一种标准化的元素访问方式,无需依赖具体集合类型的实现细节。以下是其核心要点:
一、核心方法与使用步骤
获取迭代器
通过集合的
iterator()
方法获取迭代器对象:
Iterator<String> it = list.iterator();
遍历元素
使用
hasNext()
判断是否存在下一个元素,next()
获取当前元素并移动指针:
while (it.hasNext()) {
String element = it.next();
System.out.println(element);
}
删除元素
通过
remove()
删除最后一次next()
返回的元素(需先调用next()
):
it.next();
it.remove(); // 安全删除当前元素
二、核心特性
解耦遍历逻辑
将遍历操作与集合实现分离,适用于所有
Collection
子类(如ArrayList、HashSet)。- 单向遍历机制
仅支持从前向后遍历,指针初始位置位于第一个元素之前。
快速失败机制(Fail-Fast)
若遍历过程中通过集合自身方法(非迭代器的
remove()
)修改结构,会抛出ConcurrentModificationException
异常。- 一次性使用
遍历结束后迭代器失效,需重新获取才能再次遍历。
三、与ListIterator的区别
特性 | Iterator | ListIterator |
遍历方向 | 单向(向前) | 双向(向前/向后) |
元素修改 | 仅支持删除 | 支持增删改(
,
) |
索引定位 | 不支持 | 支持(
,
) |
适用范围 | 所有Collection | 仅List及其子类 |
四、应用场景与注意事项
- 遍历时删除元素:优先使用迭代器的
remove()
而非集合自身的删除方法。 - 性能优化:对于
ArrayList
等数组结构,迭代器遍历效率与普通for循环相当;对链表结构(如LinkedList)效率更高。 - 增强for循环底层:Java的
for-each
循环本质是迭代器的语法糖。
五、示例代码
List<String> list = Arrays.asList("A", "B", "C");
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String item = it.next();
if ("B".equals(item)) {
it.remove(); // 安全删除元素
}
}
通过迭代器,开发者可以以统一的方式处理不同类型的集合,同时避免直接操作集合内部结构带来的风险。如需更复杂的遍历(如双向操作),可改用
ListIterator
并发修改异常 源码 + 图解
首先是 集合初始化的时候
会给集合内部的一个成员变量 modCount 赋值
表示集合实际上被修改的次数
接着会有一个expectedCount
当迭代器创建的时候 就会有这个出现这个变量
表示预期被修改的次数
迭代器 interator 的 next 方法中
调用一个 check 方法
每次都要判断一下 modCount 和 expectedCount 是不是相等
这样做是为了避免并发修改
并发修改异常 示例代码
import java.util.*;
public class Main {
public static void main(String[] args) {
// 并发修改异常
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()){
if(iterator.next()==1){
list.remove(1);
}
}
System.out.println(list);
}
}
报错
解决并发修改异常 一种方法
import java.util.*;
public class Main {
public static void main(String[] args) {
// 并发修改异常
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()){
if(iterator.next()==1){
iterator.remove();
}
}
System.out.println(list);
}
}