Java中对比Manager对象时ArrayList.contains始终返回false如何解决
问题诊断与修复方案
核心问题汇总
- 校验逻辑错误:你当前代码的判断逻辑是
m1.equals(manager),其中manager变量仅存储了最后一个录入的管理员实例,并未调用ArrayList.contains()和列表中所有已注册的管理员做全局比对,就算输入的信息匹配前两个录入的管理员,也会返回false。 Manager类未正确重写equals()方法:Java默认的equals()方法对比的是对象内存地址,你新创建的m1和列表中已存在的管理员属于不同实例,哪怕所有属性完全一致,默认的equals方法也会返回false。你之前重写不生效大概率是没有覆盖所有业务上判断相等的核心属性(需同时匹配姓名、姓氏、密码、所在地四个属性)。- 冗余无效代码:
Manager类的构造方法中admins = new ArrayList<Manager>()属于完全无用的逻辑,每创建一个Manager实例都会生成多余的空列表,可直接删除。
修复步骤
- 给
Manager类正确重写equals()和hashCode()方法:
import java.util.Objects; public class Manager { // 原有属性、构造方法、getter/setter保持不变 @Override public boolean equals(Object o) { // 同一对象直接返回相等 if (this == o) return true; // 类型不匹配直接返回不相等 if (o == null || getClass() != o.getClass()) return false; Manager manager = (Manager) o; // 四个核心属性全部相等才判定为同一管理员 return Objects.equals(firstName, manager.firstName) && Objects.equals(lastName, manager.lastName) && Objects.equals(password, manager.password) && Objects.equals(location, manager.location); } @Override public int hashCode() { return Objects.hash(firstName, lastName, password, location); } }
- 修改主类的校验逻辑,调用列表的
contains()方法做全局校验:
// 把原有的if判断替换为以下代码 if (DataBase.admin.contains(m1)) { System.out.println("m1 is in the array list"); } else { System.out.println("its not in the array list"); }
内容的提问来源于stack exchange,提问作者kitsune
相关产品推荐
相关产品推荐

