一、基础遍历用法
核心方法:hasNext()
、next()
作用:顺序遍历集合元素
import java.util.ArrayList;
import java.util.Iterator;
public class BasicExample {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
Iterator<String> it = list.iterator();
while(it.hasNext()) {
String fruit = it.next();
System.out.println(fruit);
}
}
}
// 输出顺序:Apple → Banana → Cherry
说明:通过iterator()
方法获取迭代器对象,hasNext()
判断是否还有元素,next()
获取当前元素并移动指针。
二、安全删除元素
方法:remove()
作用:删除当前遍历到的元素,避免并发修改异常
// 正确用法
Iterator<String> it = list.iterator();
while(it.hasNext()) {
String item = it.next();
if (item.startsWith("B")) {
it.remove(); // 通过迭代器删除
}
}
System.out.println(list); // 输出:[Apple, Cherry]
// 错误用法:直接调用集合的remove()
list.remove(item); // 会抛出ConcurrentModificationException
关键点:直接操作集合的增删方法会导致迭代器状态不一致,必须通过迭代器的remove()
方法。
三、遍历Map集合
策略:通过entrySet()
、keySet()
或values()
获取迭代器
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class MapExample {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("Java", 1);
map.put("Python", 2);
// 遍历键值对
Iterator<Map.Entry<String, Integer>> it = map.entrySet().iterator();
while(it.hasNext()) {
Map.Entry<String, Integer> entry = it.next();
System.out.println(entry.getKey() + ": " + entry.getValue());
}
}
}
// 输出示例:Java:1 Python:2
说明:Map本身不直接支持迭代器,需通过视图集合转换。
四、ListIterator双向遍历
功能扩展:previous()
, add()
, set()
适用场景:需要反向遍历或修改List元素
List<String> list = Arrays.asList("A", "B", "C");
ListIterator<String> lit = list.listIterator();
// 正向遍历
while(lit.hasNext()) {
System.out.println(lit.next()); // A → B → C
}
// 反向遍历
while(lit.hasPrevious()) {
System.out.println(lit.previous()); // C → B → A
}
// 修改元素
lit.next(); // 移动到B
lit.set("X"); // 将B改为X
System.out.println(list); // 输出:[A, X, C]
特点:支持双向移动和元素修改,仅适用于List类型集合。
五、增强for循环底层原理
语法糖:底层基于迭代器实现
for (String fruit : list) {
System.out.println(fruit);
}
// 等效于:
Iterator<String> it = list.iterator();
while(it.hasNext()) {
String fruit = it.next();
System.out.println(fruit);
}
限制:增强for循环中不能直接调用remove()
,需改用显式迭代器操作。
六、并发修改异常场景
触发条件:迭代过程中直接修改集合结构
Iterator<String> it = list.iterator();
list.add("New Element"); // 结构被修改
it.next(); // 抛出ConcurrentModificationException
解决方案:
- 使用
CopyOnWriteArrayList
等并发集合 - 通过迭代器自身的修改方法操作。
总结
场景 | 方法/策略 | 引用来源 |
---|---|---|
基本遍历 | hasNext() + next() |
|
安全删除元素 | 迭代器的remove() |
|
Map遍历 | entrySet().iterator() |
|
双向遍历与修改 | ListIterator 接口 |
|
避免并发异常 | 禁止直接操作集合的修改方法 |
通过合理应用迭代器,可以实现对集合的安全高效操作,尤其适合需要动态修改集合内容的场景。