为什么要同时重写equals和hashcode方法

现在有两个Student对象:

    Student s1=new Student("小明",18);

    Student s2=new Student("小明",18);

此时s1.equals(s2)一定返回true

注意,以下是关于hashcode的一些规定:

两个对象相等,hashcode一定相等

两个对象不等,hashcode不一定不等

hashcode相等,两个对象不一定相等

hashcode不等,两个对象一定不等

假如只重写equals而不重写hashcode,那么Student类的hashcode方法就是Object默认的hashcode方法,由于默认的hashcode方法是根据对象的内存地址经哈希算法得来的,显然此时s1!=s2,故两者的hashcode不一定相等

然而重写了equals,且s1.equals(s2)返回true,根据hashcode的规则,两个对象相等其哈希值一定相等,所以矛盾就产生了,因此重写equals一定要重写hashcode,而且从Student类重写后的hashcode方法中可以看出,重写后返回的新的哈希值与Student的两个属性有关。


想想这样会有什么后果:

        在用Set去重的时候,会执行hashcode和equals方法:

       当添加到Set的对象 HashCode码不相同时 不会调用equals方法,对象直接存到Set集合中       

        hashset相同时 才会调用equals方法 查看是否是同一个对象(是否重复)  是---则无法存入

       所以会重复添加元素,无法去重。

猜你喜欢

转载自blog.csdn.net/u012133048/article/details/87878586