为什么重写equals还要重写hashcode??

时间:2022-05-19 22:30:19

equals和hashcode是object类下一个重要的方法,而object类是所有类的父类,所以所有的类都有这两个方法


equals和hashcode间的关系:

1.如果两个对象相同(即equals比较返回true),那么他们的hashcode一定要相等

2.如果他们的hashcode相等,他们的equals不一定相等


假设两个对象,重写了其equals方法,其相等条件是属性相等,equals比较之后返回true说明假设的两个对象相等,如果没有重写hashcode的话,其返回的依然是两个对象的内存地址,那么他们的hashcode不相同,这和上面的equals和hashcode间的关系相矛盾!


思维发散与点滴感悟:

由于为了提高程序的效率才实现了hahscode方法,先进行hashcode比较,如果不同就没必要进行equals比较了,这样大大减少了equals比较的次数,当比较的数量大的时候提高的效率就很可观!比如在set集合中:

java中set集合是无序的,不能重复,那怎么保证不重复呢?单靠equals方法比较的话,如果集合中本来就有100000个元素,现在放入1000个元素,难道要将前面所有的元素都进行比较一遍?OMGD,这个效率是超级慢的,因此hashcode就大显身手了,java采用了hash表,利用了hash算法(散列算法),就是将对象数据根据该对象的特征使用特定的算法将其定义到一个地址上,那么后面进来的数据只要看对应的hashcode地址上是否有值,没有的话就直接插入,有的话不进行任何操作,这样就大大减少了equals的比较次数(因为两个不同的对象其hash也可能是相等的,所有还是需要进行equals的比较的,这样效率就大大提高了!


所以总结回答一下:为什么重写equals还要重写hashcode???

其实简单的说就为了保证同一个对象,保证在equals相等的情况下hashcode值必定相等,如果重写了equals而没有重写hashcode的话,可能会出现两个没有关系的对象equals相等(equals根据特征值进行比较),但hashcode不相同的情况,违背了equals和hashcode间的关系!