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

