Java中ArrayList删除指定元素应避免ConcurrentModificationException和漏删/越界,推荐迭代器(最稳妥)、倒序遍历(简洁高效)、removeIf(JDK8+一行解决)或removeAll(批量删除)。

Java 中 ArrayList 删除指定元素,关键在于避免 ConcurrentModificationException 和 漏删/越界 问题。直接用 for 循环配合 remove() 容易出错,推荐用迭代器、倒序遍历或 removeAll 等更安全的方式。
用迭代器边遍历边删除(最稳妥)
这是官方推荐做法,能保证线程安全(单线程下也最可靠),不会因结构修改导致异常。
- 调用 list.iterator() 获取迭代器
- 用 while(hasNext()) + iterator.next() 遍历
- 匹配到目标元素时,调用 iterator.remove()(不是 list.remove())
示例:
Iterator<String> it = list.iterator();while (it.hasNext()) {
if ("target".equals(it.next())) {
it.remove(); // 安全删除
}
}
倒序 for 循环删除(简洁高效)
从 size()-1 开始递减遍历,删除时不改变尚未访问的索引位置,避免漏删。
立即学习“Java免费学习笔记(深入)”;
- for (int i = list.size() - 1; i >= 0; i--) { ... }
- 判断元素满足条件后,直接 list.remove(i)
- 适用于已知要删一个或多个具体值的场景
注意:不能正序删,否则下标会偏移,比如删掉索引 2 后,原索引 3 的元素移到 2,但循环 i 已变成 3,就跳过了。
用 removeIf()(JDK 8+,一行解决)
内部基于迭代器实现,语义清晰,代码最简。
- list.removeIf(s -> "target".equals(s));
- 支持 lambda 表达式,可写复杂条件,如 s.length() > 5
- 返回 boolean 表示是否有元素被删,便于后续判断
批量删除多个相同元素(用 removeAll 或 retainAll)
如果要删所有等于某值的元素,且该值在集合中出现多次,可构造临时集合:
- Collection<String> toRemove = Collections.singleton("target"); // 单个值
- list.removeAll(toRemove); // 批量删,性能好
- 若只保留某些元素,可用 list.retainAll(keepSet)
注意:removeAll 依赖 equals() 判断,确保元素正确重写了该方法。


















