java中arraylist删除指定元素应避免concurrentmodificationexception和漏删/越界,推荐迭代器(最稳妥)、倒序遍历(简洁高效)、removeif(jdk8+一行解决)或removeall(批量删除)。

Java 中 ArrayList 删除指定元素,关键在于避免 ConcurrentModificationException 和 漏删/越界 问题。直接用 for 循环配合 remove() 容易出错,推荐用迭代器、倒序遍历或 removeAll 等更安全的方式。
用迭代器边遍历边删除(最稳妥)
这是官方推荐做法,能保证线程安全(单线程下也最可靠),不会因结构修改导致异常。
- 调用 list.iterator() 获取迭代器
- 用 while(hasNext()) + iterator.next() 遍历
- 匹配到目标元素时,调用 iterator.remove()(不是 list.remove())
示例:
Iteratorwhile (it.hasNext()) {
if ("target".equals(it.next())) {
it.remove(); // 安全删除
}
}
倒序 for 循环删除(简洁高效)
从 size()-1 开始递减遍历,删除时不改变尚未访问的索引位置,避免漏删。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 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
toRemove = Collections.singleton("target"); // 单个值 - list.removeAll(toRemove); // 批量删,性能好
- 若只保留某些元素,可用 list.retainAll(keepSet)
注意:removeAll 依赖 equals() 判断,确保元素正确重写了该方法。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










