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
相关产品推荐
相关产品推荐

