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
相关产品推荐
相关产品推荐

