ArrayList自定义remove方法修复咨询:当前仅删除最后元素
修复你的remove方法实现问题
首先得说,你当前的remove方法逻辑完全走偏了——它根本不是在删除元素,反而像是在做替换+截断,这就是为啥只能“删”最后一个元素的原因。咱们一步步来修复:
先分析原代码的问题
原remove(int index, Object o)方法的核心错误点:
- 循环里
data[i] = data[i - 1]是把前面的元素覆盖到后面的位置,完全搞反了删除需要的「后面元素前移」逻辑 - 最后把
data[index] = o是在替换元素,不是删除 - 整个逻辑下来,最后只是把
size减一,相当于丢弃了最后一个元素,所以看起来只能删最后一个
正确的实现方案
我们先把两个remove方法的职责理清楚:
remove(Object o):删除第一个匹配该对象的元素remove(int index):删除指定索引位置的元素(原方法的参数设计冗余,删除索引元素不需要传Object o)
1. 修复按索引删除的方法
public void remove(int index) { // 先检查索引合法性,避免数组越界 if (index < 0 || index >= size) { throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); } // 将索引后面的元素依次往前移动一位,覆盖要删除的位置 for (int i = index; i < size - 1; i++) { data[i] = data[i + 1]; } // 把最后一个位置置为null,避免引用类型的内存泄漏 data[size - 1] = null; // 数组有效元素数量减一 size--; }
2. 修复按对象删除的方法
这个方法需要先找到第一个匹配对象的索引,再调用上面的按索引删除方法:
public boolean remove(Object o) { for (int i = 0; i < size; i++) { // 处理null的情况,避免空指针异常 if (o == null ? data[i] == null : o.equals(data[i])) { remove(i); return true; // 删除成功,返回true } } return false; // 没找到匹配元素,返回false }
额外说明
- 我把原
remove(int index, Object o)改成了remove(int index),因为删除指定索引的元素不需要传入对象参数,原参数设计是冗余的 - 新增了索引合法性检查,避免调用方传入非法索引导致数组越界
- 按对象删除时处理了null的情况,符合Java集合类的常规行为
- 删除后把最后一个位置置为null,对于引用类型元素可以避免内存泄漏
内容的提问来源于stack exchange,提问作者Liu.H
相关产品推荐
相关产品推荐

