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

Java HashSet存入相等自定义类未去重 未调用重写equals原因求助

核心原因

你只重写了Cards类的equals()方法,没有同步重写hashCode()方法,违反了Java的equals-hashCode约定,导致HashSet判定两个相等的对象属于不同元素。

HashSet插入元素的判断流程是:

  • 调用待插入对象的hashCode()方法计算哈希值,找到对应的存储桶位
  • 如果该桶位没有元素,直接插入,不会调用equals()
  • 只有桶位已有元素时,才会调用equals()判断是否重复,重复则拒绝插入

你现在两个Cards对象equals()返回true,但hashCode()返回值不同,会被分配到不同的桶位,直接插入成功,自然不会触发equals()调用,也不会去重。

修复方法

在Cards类中重写hashCode()方法,保证和equals()逻辑对齐:所有参与equals()判断的属性,都要参与hashCode()的计算。示例代码如下:

import java.util.Objects;

// 在Cards类中添加如下方法
@Override
public int hashCode() {
    // 假设存储Card元素的成员变量名为cardList,替换成你实际的变量名即可
    return Objects.hash(cardList);
}

注意:如果你的Card类也没有重写equals()和hashCode(),需要同步补上,否则列表的哈希值和相等判断也会不符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 16:15:08