在Java编程中,集合(Collection)的遍历是**最高频的操作**之一。据统计,超过80%的集合使用场景需要进行元素遍历。但很多开发者只熟悉`for`循环或`forEach`,却不知道不同遍历方式的**性能差异**和**适用场景**。本文将深入剖析5种主流遍历方式,助你写出更优雅、高效的代码!
一、基础遍历方法
1. 迭代器(Iterator)模式
**经典且安全**的遍历方式,适用于所有Collection实现类
```java
List
Iterator
while(it.hasNext()) {
String element = it.next();
System.out.println(element);
// 安全删除当前元素
if("B".equals(element)) {
it.remove();
}
}
```
- ✅ 优点:支持遍历时删除元素
- ⚠️ 注意:并发修改会抛出`ConcurrentModificationException
### 2. 增强for循环(foreach)
**语法最简洁**的遍历方式(JDK5+)
```java
for(String element : list) {
System.out.println(element);
// list.remove(element); // 此处直接删除会引发异常!
}
```
- ✅ 优点:代码简洁,无需处理索引
- ❌ 局限:不能修改集合结构
二、索引遍历与特殊迭代器
### 3. 普通for循环(仅List)
**基于索引**的精准控制
```java
for(int i=0; i System.out.println(list.get(i)); // 可通过索引修改元素 list.set(i, "New_" + list.get(i)); } ``` - ⚠️ 注意:LinkedList使用get(i)会大幅降低性能(时间复杂度O(n²)) 4. ListIterator(双向遍历) **支持双向操作**的增强迭代器(仅List系列) ```java ListIterator // 逆向遍历 while(lit.hasPrevious()) { String element = lit.previous(); System.out.println("Reverse: " + element); } ``` - ✅ 特性:添加/修改元素、获取当前位置索引 三、现代遍历方式(JDK8+) 5. forEach() + Lambda **函数式编程**风格(配合Lambda表达式) ```java list.forEach(element -> System.out.println(element)); // 更复杂的操作 list.stream() .filter(s -> s.length() > 3) .forEach(System.out::println); ``` - ✅ 优点:代码简洁,支持并行流 - 🔥 性能:小数据量差异不大,大数据量优先选择并行流 四、遍历方式对比与选型建议 | 方法 | 适用场景 | 线程安全 | 修改支持 | 性能 | |---------------|-------------------------|----------|----------|----------| | Iterator | 所有集合,需要删除元素 | 否 | 删除 | O(n) | | 增强for循环 | 快速只读遍历 | 否 | 不支持 | O(n) | | 普通for循环 | ArrayList等随机访问集合 | 否 | 增删改 | O(1)* | | ListIterator | 需要双向遍历或定位 | 否 | 增删改 | O(n) | | forEach+Lambda| 函数式编程/链式操作 | 否 | 不支持 | O(n) | > *注:ArrayList的get(i)为O(1),LinkedList为O(n) 五、最佳实践 1. **读多写少**的场景优先使用`增强for循环` 2. 需要**删除元素**时使用`Iterator` 3. 大数据量**并行处理**使用`parallelStream()` 4. 避免在遍历过程中直接调用集合的add/remove方法 掌握不同的集合遍历方式,犹如为你的编程武器库添加多把利刃。建议在实际开发中根据**业务需求**、**数据规模**和**集合类型**灵活选择。下次我们将深入探讨Java8 Stream API的遍历黑科技,敬请期待!