在 Java 中,直接在遍历集合时删除元素会引发 ConcurrentModificationException
,因为集合的结构在迭代过程中发生了变化。为了避免这种问题,可以使用 Iterator
或 ListIterator
来进行安全删除。下面介绍几种常见的方式。
1. 使用 Iterator
进行删除
使用 Iterator
是在遍历集合时删除元素的推荐方法。Iterator
提供了 remove()
方法,可以安全地删除当前遍历到的元素。
示例:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("orange");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String fruit = iterator.next();
if (fruit.equals("banana")) {
iterator.remove(); // 使用迭代器的 remove 方法删除元素
}
}
System.out.println(list); // 输出: [apple, orange]
}
}
在这个例子中,iterator.remove()
方法用于安全地删除当前元素 banana
。
2. 使用 ListIterator
(仅限于 List
集合)
ListIterator
是 Iterator
的增强版本,适用于 List
集合。除了 remove()
,它还支持 add()
和 set()
等操作,可以向前和向后遍历集合。
示例:
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class Main {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("orange");
ListIterator<String> listIterator = list.listIterator();
while (listIterator.hasNext()) {
String fruit = listIterator.next();
if (fruit.equals("banana")) {
listIterator.remove(); // 使用 ListIterator 的 remove 方法删除元素
}
}
System.out.println(list); // 输出: [apple, orange]
}
}
3. 使用 removeIf()
方法(Java 8+)
在 Java 8 及以上版本中,可以使用 removeIf()
方法结合 Lambda 表达式,简洁地删除符合条件的元素。
示例:
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("orange");
// 删除等于 "banana" 的元素
list.removeIf(fruit -> fruit.equals("banana"));
System.out.println(list); // 输出: [apple, orange]
}
}
removeIf()
方法会根据提供的条件判断是否删除元素,这种方法相对简单明了,适合在条件筛选的场景下使用。
总结:
Iterator
的remove()
方法:适用于所有集合类型。ListIterator
的remove()
方法:适用于List
类型的集合,可以双向遍历。removeIf()
方法:Java 8 引入,适用于更简洁的条件删除操作。
这几种方式能够有效避免遍历时直接修改集合结构导致的 ConcurrentModificationException
。