中易网

java中重写了equals方法后,HashSet表中的contains方法为什么返回的还是false?

答案:2  悬赏:50  
解决时间 2021-01-13 13:30
  • 提问者网友:雨不眠的下
  • 2021-01-12 23:04
java中重写了equals方法后,HashSet表中的contains方法为什么返回的还是false?
最佳答案
  • 二级知识专家网友:有你哪都是故乡
  • 2021-01-12 23:10
equals和hashcode方法要同时重写,并且要在equals为true的时候,hashCode必须要相同。这个已经是一种不成文的规定了,这两个方法要重写就要一起重写,而且IDE里也会只重写一个会视为警告。所以这两个方法要同时重写。
详细的可以去看HashMap的contains实现,哪里是equals和hashCode两个同时使用了,所以在有Map的时候,必须两个都要验证,但是在ArrayList里不严重hashCode所以你部重新这个hashCode也无所谓。
全部回答
  • 1楼网友:渊鱼
  • 2021-01-12 23:56
HashSet 是无序无重复存储的,你new了两个Foo对象,但是值相同,HashSet里只会存一个,第二个new的Foo对象并没有存进去,contains()是根据equals()和hashCode()判断2个对象是否是同一个,你没重写hashCode(),系统默认按照地址计算hashCode,2个地址不同,hashCode也不同,返回当然是false。
加上public int hashCode(){
return this.value;
}
一般hashCode()和equals()都是同时重写的,不很好的覆盖hashCode()和equals() 会造成集合类工作故障!
而ArrayList是有序可重复存储的,2个Foo对象只要值相同就会返回true。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息