remove()方法删除第一个匹配元素,返回布尔值;遍历时须用iterator.remove()或removeif()避免异常;不同集合删除效率差异大,需按场景选择。

使用 remove() 方法删除单个匹配元素
Java 集合的 remove() 方法会移除**第一个**等于指定对象的元素(基于 equals() 判断),返回 true 表示成功找到并移除,false 表示未找到。注意它不按索引操作,和 List.remove(int index) 容易混淆。
常见错误:在 for-each 循环中直接调用 remove(),会触发 ConcurrentModificationException。
-
ArrayList、LinkedList、HashSet等都支持该方法,但行为一致:只删一个 - 若集合中存在多个相同元素(如重复字符串),仅首个被删
- 传入
null时,只有允许null的集合(如ArrayList)才可能匹配成功;TreeSet会抛NullPointerException
遍历中安全删除多个匹配元素必须用 Iterator.remove()
这是唯一被明确允许在迭代过程中修改集合的方式。所有实现了 Collection 的类,其 iterator() 返回的迭代器都支持 remove() 操作,且该操作是原子的、线程安全的(指单线程下不会破坏结构)。
错误写法:for (String s : list) { if (s.startsWith("a")) list.remove(s); } → 运行时报错。
立即学习“Java免费学习笔记(深入)”;
正确写法:
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String s = it.next();
if (s.startsWith("a")) {
it.remove(); // ✅ 唯一安全方式
}
}
removeIf() 是 Java 8+ 最简洁的批量过滤方案
Collection.removeIf(Predicate) 内部已封装了 Iterator 安全逻辑,一行代码即可删除所有满足条件的元素,语义清晰、不易出错。
- 适用于
ArrayList、LinkedList、HashSet、LinkedHashSet等(但TreeSet也支持) - 性能上,对
ArrayList是 O(n),内部采用“标记-移动”策略,比手动Iterator略快 - 不能用于数组或不可变集合(如
Collections.unmodifiableList()),会抛UnsupportedOperationException
示例:list.removeIf(s -> s == null || s.trim().isEmpty());
特殊集合要注意底层机制差异
不同集合的删除效率和语义有本质区别,选错方法会导致性能骤降或逻辑偏差。
-
ArrayList.remove(Object)是 O(n):需遍历找元素,再把后续元素前移 -
HashSet.remove(Object)是平均 O(1):靠hashCode()定位桶,再用equals()匹配 -
LinkedList.remove(Object)是 O(n):双向链表需逐个比较,不推荐频繁按值删除 -
CopyOnWriteArrayList的remove()是线程安全但开销极大:每次删都复制整个数组,仅适合读多写极少场景
如果要删大量元素,优先考虑 removeIf() 或先收集待删元素再批量处理,避免在循环里反复调用 remove()。










