Java中如何检查存储Student对象的ArrayList内是否存在指定姓名字符串
问题解决说明
根因分析
- 入参类型不匹配:
ArrayList<Student>存储的是Student类实例,你调用contains时传入的是String类型的"Peter",类型不匹配会直接返回false。 - 未重写
equals方法:ArrayList的contains底层通过调用元素的equals方法判断相等性,自定义类默认使用Object类的equals实现,仅比较对象内存地址,即便两个Student实例属性完全一致,只要是不同的对象实例也会判定为不相等。
解决方案
方案一:重写Student类的equals和hashCode方法(固定匹配规则场景)
如果业务有固定的相等判定规则(比如示例中仅需匹配姓名,或全属性匹配),直接在Student类中重写两个方法即可,下面是仅按姓名匹配的实现:
@Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Student student = (Student) o; return studentName.equals(student.studentName); } @Override public int hashCode() { return studentName.hashCode(); }
重写完成后,调用contains时需传入Student类型的参数:
if(obj.contains(new Student("Peter", 27, 1))){ System.out.println("Peter is on the list!"); }
如果需要全属性匹配,只需要在equals方法中加上age和rollno的判断逻辑,hashCode方法同步加入对应属性计算即可。
方案二:使用Stream流实现灵活校验(无需修改实体类)
如果匹配规则不固定,或不想修改Student类代码,Java 8及以上版本可以用Stream的anyMatch方法直接写匹配逻辑:
// 按姓名匹配Peter boolean hasPeter = obj.stream().anyMatch(student -> "Peter".equals(student.getStudent())); if(hasPeter){ System.out.println("Peter is on the list!"); } else { System.out.println("Peter is not on the list!"); }
该方案灵活性更高,需要按其他属性匹配时直接修改判断条件即可,比如按学号匹配的写法为:student -> student.getRollno() == 1。
内容的提问来源于stack exchange,提问作者Alexander Tim
相关产品推荐
相关产品推荐

