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

Java ArrayList中remove()方法无法移除自定义对象的问题

为什么ArrayList移除自定义Student对象后列表没变化?

兄弟,我太懂这种困惑了!你遇到的问题核心在于你的Student1类没有重写equals()和hashCode()方法,导致ArrayList根本找不到你想移除的对象。

问题根源

当你调用students.remove(new Student1("ABC", 25))时,Java会拿这个新创建的对象和列表里的每个元素逐一比较是否相等。但默认情况下,Object类的equals()方法是比较对象的内存地址——你新new的这个Student1实例和列表里原来的Student1("ABC",25)完全是两个不同的对象,内存地址不一样,所以ArrayList认为它们不是同一个对象,自然不会移除任何元素。

解决办法:重写equals()和hashCode()方法

我们需要让Java根据Student1的属性(比如name和age)来判断两个对象是否相等,而不是看内存地址。修改后的代码如下:

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

class Student1 {
    private String name;
    private int age;

    Student1(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String toString() {
        return "Student[" + name + ", " + age + "]";
    }

    // 重写equals,根据name和age判断对象相等性
    @Override
    public boolean equals(Object o) {
        // 先判断是否是同一个对象
        if (this == o) return true;
        // 判空或者类型不同直接返回false
        if (o == null || getClass() != o.getClass()) return false;
        // 强制类型转换后比较属性
        Student1 student1 = (Student1) o;
        return age == student1.age && Objects.equals(name, student1.name);
    }

    // 重写hashCode,和equals保持逻辑一致
    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}

public class Test1 {
    public static void main(String[] args) {
        List<Student1> students = new ArrayList<>();
        students.add(new Student1("ABC", 25));
        students.add(new Student1("XYZ", 27));
        students.add(new Student1("PQR", 26));
        students.add(new Student1("LMN", 28));
        students.remove(new Student1("ABC", 25));
        for (Student1 stud : students) {
            System.out.println(stud);
        }
    }
}

修改后的输出

Student[XYZ, 27]
Student[PQR, 26]
Student[LMN, 28]

额外说明

  • 为什么要同时重写equals和hashCode?这是Java的规范要求:如果两个对象通过equals()判断相等,它们的hashCode必须相等;如果hashCode不等,equals()必须返回false。这样能保证你的Student1对象在HashMap、HashSet等其他集合中也能正常工作。
  • 使用Objects.equals()和Objects.hash()是Java 7+的推荐写法,它们能帮你避免空指针异常,比自己手动写判断逻辑更安全。

内容的提问来源于stack exchange,提问作者Alexie2908

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:50:31