最推荐使用 Stream.filter() 创建新列表,不修改原集合且逻辑清晰;若需就地修改,则用 removeIf() 方法,内部线程安全。

Java 中过滤 ArrayList 不符合条件的数据,最常用、推荐的方式是使用 Stream API(JDK 8+),简洁安全且不修改原集合;若需就地修改原列表,可用 Iterator.remove() 或 removeIf() 方法。
用 Stream.filter() 创建新列表(推荐)
这是函数式、不可变的写法,适合大多数场景:不改动原始数据,逻辑清晰,支持链式操作。
- 调用
list.stream().filter(条件).collect(Collectors.toList()) - 条件用 Lambda 表达式,例如:过滤出长度大于 3 的字符串
ArrayList<String> list = new ArrayList<>(Arrays.asList("a", "hello", "hi", "world"));
ArrayList<String> filtered = (ArrayList<String>) list.stream()
.filter(s -> s.length() > 3)
.collect(Collectors.toList()); // ["hello", "world"]
注意:collect(Collectors.toList()) 返回的是 ArrayList 的父类 List,如需强转为 ArrayList,需确保底层实现支持(通常没问题),或用 Collectors.toCollection(ArrayList::new) 更稳妥。
用 removeIf() 直接修改原列表
如果明确要删除原集合中不符合条件的元素,removeIf() 是最简方式,内部已做并发安全处理,无需手动遍历。
立即学习“Java免费学习笔记(深入)”;
- 传入 Predicate,返回 true 的元素会被移除
- 等价于“保留满足条件的”,所以逻辑要取反
list.removeIf(s -> s.length() <= 3); // 移除长度 ≤ 3 的,剩下 ["hello", "world"]
⚠️ 注意:不能在 for-each 循环中直接调用 remove(),否则抛 ConcurrentModificationException。
用 Iterator 遍历并删除(兼容老版本 JDK)
适用于必须用 JDK 7 或更早版本的场景,或需要在遍历时做复杂判断和操作。
- 获取
Iterator,用it.hasNext()+it.next()遍历 - 满足删除条件时,只允许调用
it.remove()
Iterator<string> it = list.iterator();
while (it.hasNext()) {
String s = it.next();
if (s.length()
<h3>额外提醒:避免常见错误</h3>
<ul>
<li>不要用普通 for 循环正向遍历 + <code>remove()</code>:索引会错位,漏删或越界</li>
<li>不要在增强 for 循环里调用 <code>list.remove()</code>:触发快速失败机制</li>
<li>多线程环境下操作 ArrayList 需额外同步,建议改用 <code>CopyOnWriteArrayList</code> 或加锁</li>
</ul></string>


















