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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:18:45