当把对象加入HashSet时,集合会使用对象的hashCode值来判断对象加入的位置,但同时也会与其他已经加入HashSet集合的对象的hashCode值进行比较,如果没有相等的hashcode,则HashSet就会假设集合中没有要加入的对象。
也就是说,如果hashcode值是相异的,则HashSet就会假设对象不可能是相同的。因此我们必须override过hashCode()方法来确保相同对象有相同的hashCode值。
但有相同hashCode的对象也不一定相等,所以如果HashSet在集合中找到有与要加入的对象的hashcode相同的对象,则会调用其中一个的equals()方法来检查hashcode相等的对象是否真的相等。如果两者相同,则add()方法会返回false,表示添加失败。
hashCode()与equals()的相关规定:
1.如果两个对象相等,则hahcode值必须也相等。
2.如果两个对象相等,则对其中一个对象调用equals()方法也必须返回true。
3.如果两个对象有相同的hashcode,它们也不一定是相等的。但若两个对象相等,则他们的hashcode值一定是相等的。
4.equals()的默认行为是执行==比较,也就是说会去测试两个引用是否是对heap上的同一个对象的引用,如果没有覆盖过equals(),则两个对象永远不会被视为相同的。
a.equals(b)必须与a.hashCode()==b.hashCode()等值。
但a.hashCode()==b.hashCode()不一定与a.equals(b)等值。
也就是说hashcode是用来缩小寻找成本的,最后还要用equals()方法才能确定两个对象是否相等。
![hashcode和equals的关系](https://img-blog.csdnimg.cn/20201002223321546.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2JhbGFiaWxpYg==,size_16,color_FFFFFF,t_70#pic_center)
摘录自《Head First Java》
java基础:hashSet如何检查加入集合的值是否重复:hashcode()和equals()
最新推荐文章于 2022-08-19 14:36:03 发布