You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:39:33