重写equals和hashcode的原因:
为了通过调用hashcode()和equals()方法来判断2个对象是否相同。在Java中,JDK和第三方的涉及到比较对象是否相同的类都会通过调用对象的hashcode()和equals()来判断2个对象是否相同。
Java中所有的对象都继承Object类,Objects类的hashcode和equals方法对于自定义类来说,准确性太弱,因此,我们必须手动重写这两个方法来保证代码的准确。
为什么要重写hashcode?
在验证两个对象是否一致时,如果都使用equals(),代价太大,hashcode()的代价相对较小,当两个对象的hashcode()不一致时,就可以认为这两个对象不相同,从而降低使用equals()的次数,从而提升性能。
为什么要重写equals?
不同的对象也有可能会产生相同的hashcode,成为hash冲突,当产生hash冲突时,使用equals来检查两个类是否相同
equals方法的要求:
- 自反性:对于任何非空的obj,obj.equals(obj)=true
- 对称性:如果obj1.equals(obj2)=true;那么obj2.equals(obj1)=true
- 传递性:如果obj1.equals(obj2)=true,obj2.equals(obj3)=true,那么obj1.equals(obj3)=true
- 一致性:如果x和y的引用没有发生变化,那么反复调用x.equals(y)的结果应该相同
- 对于任何非空的引用x,x.equals(null)应该返回false
Object类的默认hasCode和equals:
Objects类的默认HashCode返回的是对象的地址
网友评论