Contains方法始终返回false?联系人列表添加去重失效问题咨询
问题根源与解决方案
你遇到的问题核心在于List.contains()方法的工作原理——它默认是通过对象的引用地址来判断相等性的,而不是对象的内容。也就是说,即使两个ContactVO的姓名和电话号码完全一致,只要它们是不同的对象实例,contains()就会返回false,导致重复添加。
解决方法一:重写ContactVO的equals()和hashCode()方法
这是最规范的做法,Java集合框架的很多方法(比如contains()、HashSet等)都依赖这两个方法来判断对象是否相等。我们需要基于联系人的唯一标识(比如电话号码,这是区分联系人的核心依据)来重写这两个方法:
import java.util.Objects; public class ContactVO { private String ContactName; private String ContactNumber; // 请补充构造方法、Getter和Setter方法 @Override public boolean equals(Object o) { // 先判断是否为同一个对象引用 if (this == o) return true; // 判断是否为空或类型不匹配 if (o == null || getClass() != o.getClass()) return false; // 强转为ContactVO类型 ContactVO that = (ContactVO) o; // 这里仅用电话号码判断相等,你也可以根据需求加上姓名一起校验 return Objects.equals(ContactNumber, that.ContactNumber); } @Override public int hashCode() { // 与equals逻辑保持一致,仅用电话号码生成哈希值 return Objects.hash(ContactNumber); } }
重写之后,phoneContactVOList.contains(contactVO)就会基于电话号码的内容判断是否存在重复,而非对象引用,这样就能正确过滤重复联系人了。
解决方法二:手动遍历列表判断重复
如果你暂时不想修改ContactVO类,也可以通过遍历列表,手动比较联系人的关键属性来判断是否存在重复:
// 标记是否存在重复联系人 boolean contactExists = false; for (ContactVO existingContact : phoneContactVOList) { // 比较电话号码(如需严格校验可同时对比姓名) if (phoneNumber.equals(existingContact.getContactNumber())) { contactExists = true; break; } } // 不存在重复才添加 if (!contactExists) { contactVO.setContactName(name); contactVO.setContactNumber(phoneNumber); phoneContactVOList.add(contactVO); }
额外提醒
注意统一电话号码的格式(比如去除空格、统一区号格式等),避免因为格式差异导致本该视为重复的联系人被误判为不同联系人。
内容的提问来源于stack exchange,提问作者Amar Giram
相关产品推荐
相关产品推荐

