安全删除 ArrayList 元素需避免 ConcurrentModificationException,推荐使用 Iterator.remove();也可用倒序 for 循环、收集后批量删除或 Java 8+ 的 removeIf()。

在 Java 中,直接在 for-each 循环或普通 for 循环中调用 ArrayList.remove() 会抛出 ConcurrentModificationException,因为迭代器检测到结构被意外修改。安全删除的关键是**使用迭代器的 remove() 方法**,或者改用支持并发修改的遍历方式。
用 Iterator 的 remove() 方法(推荐)
这是最标准、最安全的方式。Iterator 的 remove() 是唯一被允许在遍历时删除元素的操作,它会同步更新内部状态,避免异常。
- 必须先调用
next(),再调用remove();不能连续调用两次remove() - 不能和集合自身的
remove()混用(比如在迭代过程中又调用list.remove(...))
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String item = it.next();
if ("target".equals(item)) {
it.remove(); // ✅ 安全删除
}
}倒序 for 循环(适用于按索引删除)
从后往前遍历,删除元素不会影响尚未访问的索引位置,因此不会跳过元素或越界。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 适合已知删除条件可转为索引判断(如根据内容、下标范围等)
- 注意:每次
remove(int index)后,后续元素前移,但因为是倒序,前面的索引不受影响
for (int i = list.size() - 1; i >= 0; i--) {
if ("target".equals(list.get(i))) {
list.remove(i); // ✅ 安全,i 不会“失效”
}
}收集待删元素,循环结束后批量删除
先遍历一次,把要删的对象(或索引)存入临时集合,再调用 removeAll() 或逐个删除。适合删除逻辑复杂、或需多次判断的场景。
立即学习“Java免费学习笔记(深入)”;
- 注意:用
removeAll(Collection)时,传入的集合不能是原 list 的子集引用(如subList),否则可能引发异常 - 若用对象删除,确保对象的
equals()实现正确
List<String> toRemove = new ArrayList<>();
for (String item : list) {
if (shouldRemove(item)) {
toRemove.add(item);
}
}
list.removeAll(toRemove); // ✅ 安全使用 removeIf()(Java 8+,简洁高效)
这是最简洁的现代写法,底层仍基于迭代器,线程安全(单线程下),语义清晰。
- 参数是
Predicate<E>,返回true的元素会被删除 - 不可在 lambda 中修改原 list,否则行为未定义
list.removeIf(item -> "target".equals(item)); // ✅ 一行搞定

















