You need to enable JavaScript to run this app. Java HashSet添加equals和hashCode均相同对象却去重失效,是什么原因?
优惠活动
大模型
产品
解决方案
定价
更多

Java HashSet添加equals和hashCode均相同对象却去重失效,是什么原因?

问题根因

你没有正确重写Object类的hashCode()方法,核心错误是方法名大小写拼写错误:

  • 你在Counter类里定义的方法是public int hashcode(),code的首字母是小写
  • Java Object类要求的哈希计算方法是public int hashCode(),Code的首字母是大写

现象解释

  • 你自定义的hashcode()是普通成员方法,不属于Object类的重写方法,HashSet添加元素时默认调用Object类自带的hashCode()(基于对象内存地址计算),两个Counter是不同实例,默认哈希值不同,所以都被成功加入集合,最终size为2
  • 你手动打印时主动调用了自己写的小写hashcode()方法,所以输出的哈希值相等,equals方法你确实重写正确所以返回true,二者逻辑不冲突。

修复方案

把Counter类里的哈希方法名修改为符合Java规范的写法即可,建议加上@Override注解,编译阶段就能检查重写错误,避免同类问题:

@Override
public int hashCode(){
    int hashcode=31;
    for(int i=0;i<arr.length;i++){
        if(arr[i]==null)
            hashcode+=i;
        else
            hashcode+=31*arr[i];
    }
    return hashcode;
}

内容的提问来源于stack exchange,提问作者nanosoft

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 17:21:01