举个🌰:
我们创建一个Student对象,它分别有age,name,id三个属性
在没有重写equals和hashcode方法的时候,我们可以看到,即使对象属性值相同,他们也是不相等的,因为地址值不同
接下来我们重写Student的equals与hashcode方法,我们认为age和name相同,这两个对象就是同一个
测试:在重写了以后,s1与s2 id不同,age,name相同我们认为他们相等,符合预期
有的同学可能存在这样的疑问,只重写了equals没有重写hashcode的效果和上面一样
接下来我们看这样一个🌰:
首先我们测试重写了hashcode的Student
符合预期效果对吧,那我们注释掉Student的重写的hashcode方法再试一下
同样的代码,针对set集合的测试显然不符合我们预期想要的结果
原因是ArrayList是根据equals来判断是后包含,而不管hashCode是否不相等。
HashSet处理流程则不一样,先判断两个对象的hashCode方法是否一样,如果不一样,立即认为两个对象equals不相等,并不调用equals方法,当hashCode相等时,再根据equals方法判断两个对象是否相等。