本文目录导读:

- 增强for循环(最常用)
- 传统for循环(适用于List)
- 迭代器(Iterator)- 适合删除元素
- Java 8+ forEach(Lambda表达式)
- Stream API(Java 8+)
- 不同类型集合的遍历示例
- 性能对比与选择建议
- 实际案例
- 最佳实践建议
在Java中遍历集合数据有多种方式,以下是几种常用的遍历方法及其适用场景:
增强for循环(最常用)
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
list.add("C++");
// 增强for循环
for (String item : list) {
System.out.println(item);
}
传统for循环(适用于List)
// 传统for循环(适用于有索引的集合)
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
迭代器(Iterator)- 适合删除元素
// 使用Iterator遍历
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String item = iterator.next();
if (item.equals("Python")) {
iterator.remove(); // 安全删除元素
}
System.out.println(item);
}
Java 8+ forEach(Lambda表达式)
// Lambda表达式遍历 list.forEach(item -> System.out.println(item)); // 方法引用 list.forEach(System.out::println);
Stream API(Java 8+)
// Stream API遍历
list.stream()
.filter(item -> item.length() > 3)
.forEach(System.out::println);
// 并行处理
list.parallelStream()
.forEach(System.out::println);
不同类型集合的遍历示例
List遍历
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
// 推荐:增强for循环
for (String s : list) {
System.out.println(s);
}
Set遍历
Set<String> set = new HashSet<>();
set.add("X");
set.add("Y");
set.add("Z");
// Set没有索引,只能用增强for或迭代器
for (String s : set) {
System.out.println(s);
}
Map遍历
Map<String, Integer> map = new HashMap<>();
map.put("John", 25);
map.put("Alice", 30);
map.put("Bob", 28);
// 遍历键值对
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
// 只遍历键
for (String key : map.keySet()) {
System.out.println(key);
}
// 只遍历值
for (Integer value : map.values()) {
System.out.println(value);
}
性能对比与选择建议
| 遍历方式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 增强for循环 | 通用遍历 | 简洁、安全 | 不能获取索引 |
| 传统for循环 | List遍历 | 可操作索引 | 对Set等不适用 |
| Iterator | 需要删除元素 | 支持删除操作 | 代码稍繁琐 |
| forEach(λ) | Java 8+ | 简洁、函数式 | 不支持break/continue |
| Stream API | 复杂数据处理 | 链式操作、并行处理 | 性能开销较大 |
实际案例
public class CollectionTraversalDemo {
public static void main(String[] args) {
// 学生成绩集合
Map<String, List<Integer>> studentGrades = new HashMap<>();
studentGrades.put("张三", Arrays.asList(85, 90, 78));
studentGrades.put("李四", Arrays.asList(92, 88, 95));
studentGrades.put("王五", Arrays.asList(76, 82, 80));
// 使用forEach遍历所有学生成绩
studentGrades.forEach((name, grades) -> {
int total = grades.stream().mapToInt(Integer::intValue).sum();
double avg = total / (double) grades.size();
System.out.printf("%s: 总分%d, 平均分%.1f%n", name, total, avg);
});
}
}
最佳实践建议
- 简单遍历:使用增强for循环或forEach
- 需要索引:使用传统for循环
- 需要删除元素:使用Iterator
- 复杂数据转换:使用Stream API
- 处理大量数据:考虑并行流 parallelStream()
选择哪种方式主要取决于你的具体需求和代码的可读性要求。