一、基础遍历方式
1. 普通 for
循环
特点:通过索引逐个访问元素,适用于数组和集合,但修改集合(如删除元素)时需谨慎。
代码示例:
List list = Arrays.asList("A", "B", "C");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
适用场景:需要索引操作(如随机访问)、简单遍历数组或集合。
2. 增强 for
循环(foreach)
特点:语法简洁,无需索引,但无法直接修改集合(如删除元素)。
代码示例:
for (String item : list) {
System.out.println(item);
}
底层实现:编译后转化为迭代器遍历,本质调用 iterator()
和 next()
。
适用场景:快速遍历集合或数组,无需修改数据。
二、进阶遍历方式
1. 迭代器(Iterator)
特点:通过 hasNext()
和 next()
方法遍历,支持安全删除元素(通过 remove()
)。
代码示例:
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
String item = iterator.next();
if (item.equals("B")) {
iterator.remove(); // 安全删除
}
}
优势:避免并发修改异常(ConcurrentModificationException
)。
适用场景:需要动态修改集合(如删除元素)。
2. ListIterator
(双向遍历)
特点:继承自 Iterator
,支持向前/向后遍历和修改元素。
代码示例:
ListIterator litr = list.listIterator();
while (litr.hasNext()) {
String item = litr.next();
litr.set(item.toUpperCase()); // 修改元素
}
适用场景:需要双向遍历或直接修改元素的集合(如 ArrayList
)。
三、函数式编程与流式处理
1. Lambda 表达式 + forEach()
特点:Java 8 引入,通过函数式接口简化遍历,支持链式操作。
代码示例:
list.forEach(item -> System.out.println(item));
// 或简写为
list.forEach(System.out::println);
优势:代码简洁,可扩展为复杂逻辑(如过滤、映射)。
适用场景:函数式风格的集合操作。
2. Stream API
特点:链式操作处理数据流(如过滤、映射、归约),支持并行处理。
代码示例:
list.stream()
.filter(s -> s.startsWith("A"))
.forEach(System.out::println);
优势:声明式编程,逻辑清晰,可并行执行。
适用场景:复杂数据处理(如过滤、聚合、转换)。
3. 并行流(Parallel Stream)
特点:利用多核 CPU 加速处理,适用于大数据量场景。
代码示例:
list.parallelStream()
.map(String::toUpperCase)
.forEach(System.out::println);
注意事项:需确保操作线程安全,避免副作用。
适用场景:高性能需求的大规模数据处理。
四、总结与选择建议
方式 | 适用场景 | 注意事项 |
---|---|---|
普通 for 循环 | 需要索引或遍历数组 | 删除元素易出错 |
增强 for 循环 | 快速遍历集合或数组 | 无法修改集合内容 |
迭代器 | 动态修改集合(如删除元素) | 避免并发修改异常 |
Stream API | 复杂数据处理(过滤、映射、归约) | 声明式编程,逻辑清晰 |
并行流 | 大数据量的高性能处理 | 确保线程安全 |
推荐学习路径:
- 初学者优先掌握
for
循环和增强for
。 - 中级开发者学习迭代器和
ListIterator
。 - 高级场景使用 Stream API 和并行流优化性能。