遍历同时修改 List:深入解析与实际应用
在 Java 编程中,遍历 List 的同时进行修改是一个常见的需求,但也是一个容易引发问题的操作。Java 提供了多种方式来实现这一需求,每种方式都有其优缺点和适用场景。本文将深入探讨这些方式,并通过丰富的代码示例和详细的解释,帮助你全面理解其工作原理及实际应用。
前置知识
在深入探讨之前,我们需要了解一些基本概念:
- List:Java 集合框架中的一种接口,用于存储有序的元素集合。
- 遍历:按顺序访问集合中的每个元素。
- 修改:在遍历过程中对集合进行添加、删除或更新操作。
- 并发修改异常:在遍历过程中修改集合,可能会引发
ConcurrentModificationException
异常。
方式一:使用普通 for 循环
使用普通 for 循环遍历 List,并在循环体内进行修改操作,是一种简单且直接的方式。这种方式不会引发 ConcurrentModificationException
异常,因为它是通过索引直接访问和修改元素。
示例代码
import java.util.ArrayList;
import java.util.List;
public class ForLoopExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
for (int i = 0; i < list.size(); i++) {
String fruit = list.get(i);
System.out.println(fruit);
if (fruit.equals("Banana")) {
list.remove(i);
i--; // 调整索引,避免跳过元素
}
}
System.out.println("After modification: " + list);
}
}
输出:
Apple
Banana
Cherry
After modification: [Apple, Cherry]
解释:
- 使用普通 for 循环遍历 List。
- 在循环体内,通过索引访问和修改元素。
- 删除元素后,调整索引
i--
,避免跳过下一个元素。
方式二:使用增强 for 循环和临时列表
使用增强 for 循环遍历 List,并将需要修改的元素添加到临时列表中,最后统一进行修改。这种方式不会引发 ConcurrentModificationException
异常,但需要额外的存储空间。
示例代码
import java.util.ArrayList;
import java.util.List;
public class EnhancedForLoopExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
List<String