equals
所有类都继承了Object ,也就获得了equals方法。如果要比较对象的属性是否相同,判定对象是否相同,则必须重写equals方法。
hashcode
在一定的程度上 可以将hash值理解为对象的内存空间的地址值
equals和 == 间的关系:
总的来说Java的数据类型分为两类:
- 基本数据类型 如:byte,short,char,int,long,float,double,boolean 等。他们之间的比较,应使用双等号==,比较的是他们的值。
- 引用数据类型 当他们用==进行比较的时候,比较的是他们在内存中的存放地址。 而equals在默认的情况下也是比较他们在内存中的存放地址。但是一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。而是和相关类的定义有关了。
equals和hashcode间的关系:
1.如果两个对象相同(即equals比较返回true),那么他们的hashcode一定要相等
2.如果他们的hashcode相等,他们的equals不一定相等
为什么重写equals还要重写hashcode
假设现在new了两个对象,我们对类重写了equals()方法,其相等条件是判断类的某些属性或者全部属性是否相等,返回true我们就说这两个对象相等,如果不重写hashcode,其返回的依然是两个对象的内存空间的地址值,那么他们的hashcode不相同,这和上面的equals和hashcode间的关系的第二条矛盾!所以重写equals()一定要记得重写hashcode()。