Java中删除ArrayList满足条件元素的正确方法有四种:①用Iterator.remove()最兼容安全;②Java 8+推荐removeIf()一行解决;③倒序for循环避免索引错位但性能差;④收集待删元素再批量remove,适合复杂条件。

Java 中删除 ArrayList 里满足指定条件的元素,**不能边遍历边用 remove() 直接删**,否则会跳过下一个元素或抛 ConcurrentModificationException。正确做法有几种,按场景推荐如下:
用 Iterator 的 remove() 安全删除
这是最经典、兼容性最好的方式,适用于所有 Java 版本。
Iterator 在调用 remove() 时会同步更新内部状态,避免并发修改异常。
- 先获取 list 的迭代器:
Iterator<String> it = list.iterator(); - 循环中用
it.hasNext()和it.next()遍历 - 满足条件时调用
it.remove()(不是 list.remove()!)
示例:删除所有长度大于 3 的字符串
立即学习“Java免费学习笔记(深入)”;
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String s = it.next();
if (s.length() > 3) {
it.remove(); // ✅ 安全
}
}用 removeIf()(Java 8+ 推荐)
一行代码搞定,简洁清晰,底层也是基于迭代器安全删除。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 参数是
Predicate<T>,写个 lambda 表达式即可 - 自动处理遍历与删除逻辑,无需手动管理 iterator
- 返回
boolean:是否有元素被删
示例:删除所有 null 或空字符串
list.removeIf(s -> s == null || s.trim().isEmpty());
倒序 for 循环 + 索引删除(慎用)
从后往前遍历,删元素不影响前面未处理的索引,可避免下标错位。
- 仅适用于知道索引或能快速定位索引的场景
- 不推荐用于复杂条件(比如需要对象字段计算),可读性差
- 注意:每次
remove(int index)是 O(n) 操作,大数据量时性能较差
示例:删除所有偶数索引位置的元素(仅作演示,非条件删除)
for (int i = list.size() - 1; i >= 0; i--) {
if (someCondition(list.get(i))) {
list.remove(i); // ✅ 不影响前面的索引
}
}收集待删元素再批量移除(适合多条件/复杂判断)
先遍历一次,把要删的对象存进临时集合,再调用 removeAll()。
- 适合条件复杂、需多次计算,或需保留原始 list 做其他用途的场景
- 注意:若 list 元素无重写
equals(),可能删不掉;建议用LinkedHashSet避免重复 - 内存开销略大,但逻辑最直观
示例:删除所有价格高于 100 且状态为 "sold" 的商品
List<Product> toRemove = new ArrayList<>();
for (Product p : list) {
if (p.getPrice() > 100 && "sold".equals(p.getStatus())) {
toRemove.add(p);
}
}
list.removeAll(toRemove);

















