1. 简介
在程序开发中,遍历一个 List
集合是最常见的操作之一。
本篇文章将带你回顾 Java 中遍历 List
的各种方式。我们主要关注正向遍历,当然反向遍历(可以参考 Java List 反向遍历)也同样简单易行。
2. for 循环
我们先从最常见的 for
循环开始。
先定义一个示例用的国家列表:
List<String> countries = Arrays.asList("Germany", "Panama", "Australia");
2.1. 基础 for 循环
基础的 for
循环是控制流程中最常见的结构之一。它由三个部分组成,用分号分隔:初始化语句、终止条件、更新语句。
下面是一个典型的使用索引遍历的方式:
for (int i = 0; i < countries.size(); i++) {
System.out.println(countries.get(i));
}
- 初始化语句:声明一个整型变量作为索引。
- 终止条件:判断是否越界。
- 更新语句:每次循环后索引自增。
✅ 优点:灵活,支持随机访问
❌ 缺点:代码略显啰嗦,容易出错(比如越界)
2.2. 增强型 for 循环(for-each)
增强型 for
循环(也叫 for-each)语法简洁,适用于只读遍历场景。它隐藏了索引细节,直接访问元素。
for (String country : countries) {
System.out.println(country);
}
✅ 优点:代码简洁、可读性高
⚠️ 缺点:无法获取索引,不能修改集合
3. 使用迭代器(Iterator)
3.1. Iterator
Java 中的 Iterator
是一种设计模式,它提供了一种统一的方式来遍历集合,而无需关心底层实现。
Iterator<String> countriesIterator = countries.iterator();
while(countriesIterator.hasNext()) {
System.out.println(countriesIterator.next());
}
hasNext()
:判断是否还有下一个元素 ✅next()
:返回下一个元素 ✅
这种方式的好处是解耦,无论底层是 ArrayList
还是 LinkedList
,都可以用统一接口遍历。
3.2. ListIterator
ListIterator
是 Iterator
的子接口,专门用于 List
,支持双向遍历。
ListIterator<String> listIterator = countries.listIterator();
while(listIterator.hasNext()) {
System.out.println(listIterator.next());
}
除了正向遍历外,还可以通过 hasPrevious()
和 previous()
方法反向遍历。
✅ 优点:支持双向遍历、可选位置插入/删除
⚠️ 缺点:仅适用于 List
接口的实现类
4. forEach() 方法
4.1. Iterable.forEach()
从 Java 8 开始,Iterable
接口新增了 forEach()
方法,可以直接传入 Lambda 表达式或方法引用。
countries.forEach(System.out::println);
这是最简单粗暴的方式之一,尤其适合配合函数式编程。
✅ 优点:代码简洁,支持函数式风格
⚠️ 缺点:无法中途 break 或 continue
4.2. Stream.forEach()
通过 Stream
API,我们可以链式调用多个操作,如 filter()
、map()
等,最后使用 forEach()
输出结果。
countries.stream().forEach((c) -> System.out.println(c));
这种方式更适用于需要对数据进行处理后再输出的场景。
✅ 优点:链式操作,功能强大
⚠️ 缺点:性能略逊于直接遍历(尤其是小数据量)
5. 总结
本文介绍了 Java 中遍历 List
的常见方式,包括:
- 基础
for
循环 - 增强型
for
循环(for-each) Iterator
和ListIterator
- Java 8 引入的
forEach()
方法 - 以及结合
Stream
的forEach()
使用方式
每种方式都有其适用场景,选择时应根据是否需要索引、是否要中途退出、是否涉及函数式处理等因素综合考虑。