ArrayList删除元素主要有两种方式:按索引删除(remove(int index),返回被删元素,索引越界抛IndexOutOfBoundsException)和按值删除(remove(Object o),用equals查找首个匹配项,成功返回true);需警惕重载混淆、ConcurrentModificationException及性能开销。

Java 中 ArrayList 删除元素主要有两种方式:按索引删除和按值删除。关键在于理解它们的行为差异、潜在陷阱(比如并发修改异常、remove 重载混淆),以及如何安全高效地操作。
按索引删除元素(推荐用于已知位置)
使用 remove(int index) 方法,直接根据下标移除元素,返回被删的元素对象。注意索引必须在 [0, size) 范围内,否则抛出 IndexOutOfBoundsException。
- 删除后,后续元素自动前移,集合大小减 1
- 适合循环中已知确切位置(如删最后一个、删第 3 个)的场景
- 示例:list.remove(2); —— 删除索引为 2 的元素(即第 3 个)
按值删除元素(注意是第一个匹配项)
使用 remove(Object o) 方法,遍历查找并删除第一个等于该对象的元素(依赖 equals() 判断),删除成功返回 true,未找到返回 false。
- 不要误写成
remove(1)想删值为 1 的元素——这其实是按索引删! - 对基本类型包装类(如
Integer)要注意自动装箱与缓存(-128~127 范围内 == 可能成立,但应始终用 equals) - 示例:list.remove("apple"); —— 删除第一个值为 "apple" 的字符串
批量删除多个指定值(避免 ConcurrentModificationException)
若需删除所有匹配的元素(不止第一个),不能在增强 for 循环中直接调用 remove(),否则会抛 ConcurrentModificationException。正确做法有:
立即学习“Java免费学习笔记(深入)”;
- 用迭代器的
remove()方法(安全且标准):
Iterator<String> it = list.iterator();
while (it.hasNext()) {
if ("target".equals(it.next())) it.remove();
} - 使用 Java 8+ 的
removeIf()(最简洁):
list.removeIf(s -> "target".equals(s)); - 倒序 for 循环(适用于按条件删,不依赖迭代器):
for (int i = list.size() - 1; i >= 0; i--) {
if ("target".equals(list.get(i))) list.remove(i);
}
删除时的常见坑与提醒
几个容易出错的地方要特别注意:
-
remove(int) 和 remove(Object) 是重载方法,编译器靠参数类型选择——传
int就走索引删,传Integer可能走值删(取决于是否发生自动拆箱) - 删除
null元素:用remove(null)即可,ArrayList 支持存储 null - 删除后原集合被修改,若需保留原列表,应先复制(如 new ArrayList(original))
- 频繁删除首部或中部元素性能较差(O(n) 移动开销),大量随机删建议考虑
LinkedList或重构逻辑


















