ArrayList.remove()有两种重载:remove(int index)按索引删除并返回元素,remove(Object o)按对象删除并返回布尔值;误用会导致IndexOutOfBoundsException或逻辑错误。

Java 中 ArrayList.remove() 提供两种重载方式:一种按索引删除(返回被删元素),一种按对象删除(返回是否删除成功)。用错方法会导致 IndexOutOfBoundsException 或逻辑错误(比如想删元素却删了索引位置),关键看传入参数类型。
按索引删除:remove(int index)
传入一个 int 类型的下标,删除该位置的元素,并将后续元素前移。索引从 0 开始,必须满足 0 ≤ index ,否则抛出 IndexOutOfBoundsException。
- 调用后集合大小减 1,原索引位置之后的所有元素下标都减 1
- 返回被删除的元素(类型为泛型 E,比如 String、Integer)
- 示例:list.remove(2) 删除第 3 个元素(索引为 2)
按对象删除:remove(Object o)
传入一个 Object 类型的值,遍历集合,用 equals() 方法比较,**删除第一个匹配的元素**(从头开始找)。不关心索引,只认内容相等。
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
- 如果找到并删除,返回
true;没找到,返回false - 注意:对 null 元素也支持(用 == 判断),且自定义类需正确重写
equals() - 示例:list.remove("hello") 删除第一个值为 "hello" 的字符串
容易踩坑的典型问题
最常见错误是向 remove() 传入一个整数常量(如 list.remove(5)),本意是删值为 5 的元素,结果却触发了 remove(int) 版本,删掉了索引为 5 的元素——尤其当列表里存的是 Integer 时更难察觉。
- 解决办法:明确类型。要删对象,就强转成 Object:list.remove((Integer)5) 或 list.remove(Integer.valueOf(5))
- 遍历时删除多个元素?别直接用普通 for 循环调 remove(int),会导致跳过下一个元素。改用迭代器
Iterator.remove()或倒序 for 循环 - 删除所有匹配项?不能只调一次
remove(o),它只删第一个。可用removeIf(predicate)(Java 8+)或循环 + 迭代器
实用小技巧
快速判断该用哪个 remove:
- 你要删“第几个” → 用
remove(int index) - 你要删“值是多少” → 用
remove(Object o),确保传的是对象而非基本类型字面量 - 不确定类型又怕误调?可先用
list.indexOf(o)获取索引,再用remove(index)(适合需要确认存在性时)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










