在Java编程中,遍历列表是一项基础且频繁的操作,无论是处理业务数据还是实现算法逻辑,掌握多种遍历方式及其适用场景至关重要,本文将系统介绍Java中遍历列表的常用方法,包括其原理、优缺点及代码示例,帮助开发者根据实际需求选择最优方案。

传统for循环:基础且可控的遍历方式
传统for循环是Java中最早的遍历方式,通过索引访问列表元素,具有直观易理解的特点,其核心思想是通过size()方法获取列表长度,再通过索引逐个访问元素。
List<String> list = Arrays.asList("A", "B", "C");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
优点:
- 可自由控制遍历顺序,支持任意位置访问(如倒序遍历
for (int i = list.size()-1; i >=0; i--)); - 适用于需要操作索引的场景(如根据索引修改元素)。
缺点:
- 代码相对冗长,对于简单遍历不够简洁;
- 若在遍历中修改列表结构(如增删元素),可能导致
IndexOutOfBoundsException。
增强for循环(for-each):简洁高效的遍利选择
Java 5引入了增强for循环,语法更简洁,无需关心索引细节,直接遍历集合中的每个元素。
List<String> list = Arrays.asList("A", "B", "C");
for (String item : list) {
System.out.println(item);
}
优点:
- 代码简洁,可读性高,适合仅需遍历元素的场景;
- 底层通过迭代器实现,避免了索引越界的风险。
缺点:
- 无法直接获取元素索引;
- 遍历过程中不能修改集合结构(如调用
list.remove()会抛出ConcurrentModificationException)。
迭代器(Iterator):安全遍历与删除元素的首选
迭代器是Java集合框架中的核心接口,专门用于安全遍历集合,尤其是在遍历过程中需要删除元素时。

List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String item = iterator.next();
if ("B".equals(item)) {
iterator.remove(); // 安全删除当前元素
}
}
关键点:
hasNext():判断是否有下一个元素;next():获取下一个元素;remove():删除迭代器最后返回的元素(必须先调用next()再调用remove())。
优点:
- 支持在遍历时安全删除元素,避免并发修改异常;
- 适用于所有集合类,统一了遍历接口。
缺点:
- 只能单向遍历,无法倒序访问;
- 代码比for-each稍复杂。
ListIterator:双向遍历与增删改的利器
ListIterator是Iterator的子接口,专门针对List接口设计,支持双向遍历、元素修改及插入操作。
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
ListIterator<String> listIterator = list.listIterator();
// 正向遍历
while (listIterator.hasNext()) {
System.out.println(listIterator.next());
}
// 反向遍历
while (listIterator.hasPrevious()) {
System.out.println(listIterator.previous());
}
// 修改元素
listIterator.next();
listIterator.set("X"); // 将当前元素修改为"X"
// 插入元素
listIterator.add("Y");
核心方法:
hasPrevious()/previous():反向遍历;set(E e):修改最后访问的元素;add(E e):在当前位置插入元素。
适用场景:
- 需要双向遍历或修改元素时;
- 对遍历顺序有特殊要求的场景。
Java 8+ Stream API:函数式遍历与数据处理
Java 8引入的Stream API为集合操作提供了函数式编程范式,遍历可与过滤、映射等操作结合,代码更简洁且功能强大。

List<String> list = Arrays.asList("A", "B", "C");
// 遍历并打印
list.stream().forEach(System.out::println);
// 过滤后遍历
list.stream()
.filter(item -> !"B".equals(item))
.forEach(System.out::println);
特点:
- 惰性求值:中间操作(如
filter)不会立即执行,只有终端操作(如forEach)触发执行; - 支持并行流(
parallelStream())提升大数据量处理效率; - 可与Lambda表达式结合,实现复杂的数据处理逻辑。
注意事项:
- Stream操作不会修改原集合,而是返回新结果;
- 遍历过程中同样不支持修改集合结构。
性能对比与选择建议
| 遍历方式 | 性能 | 适用场景 |
|---|---|---|
| 传统for循环 | 较高 | 需要索引或倒序遍历 |
| 增强for循环 | 高 | 简单遍历,无需索引 |
| 迭代器 | 中等 | 遍历时需要删除元素 |
| ListIterator | 中等 | 双向遍历、增删改元素 |
| Stream API | 中等(并行流高) | 函数式编程、复杂数据处理 |
选择建议:
- 日常遍历优先使用增强for循环,代码简洁高效;
- 需要删除元素时,必须使用迭代器;
- 涉及复杂数据处理(如过滤、聚合)时,Stream API是最佳选择;
- 对性能敏感且需要频繁索引操作时,考虑传统for循环。
Java中遍历列表的方法多样,每种方式都有其适用场景,开发者需根据实际需求(是否需要索引、是否修改集合、代码简洁性等)选择合适的遍历方式,掌握传统for循环、增强for循环、迭代器及Stream API等核心方法,能够灵活应对各种开发场景,提升代码的可读性和健壮性。















