1.何时需要重写equals方法?
当一个类具备自己特有的“逻辑相等”的概念。
2.如何覆写equals方法
(1)使用instanceof 操作符检查实参是否为正确的类型
如果传进来的类型不属于同一个类型,那也就没有比较的必要了。
(2)对于类中的每一个“关键域”(成员变量)检查实参中的域值与当前对象中的域值是否相等
两个对象相等,它们的各个属性的值肯定也是要相等的,除非你应用的场景比较特殊。接下来的几点是对这点的补充
(3)对于非float和double类型的原始类型域,使用==进行比较
(4)对于对象引用域,递归调用equals方法
(5)对于float域,使用Float.floatToIntBits(afloat)转换为int,再使用==比较
(6)对于double域,使用Double.doubleTolongBits(adouble)转换为int,再使用==比较
(7)对于数组域,调用Arrays.equals方法
3.如何覆写hashcode方法
(1)把某个非零常数值,例如17,保存在int变量result中;
(2)对于对象中每一个关键域f(指equals方法中考虑的每一个域):
(3) boolean型,计算(f? 0 : 1);
(4) byte,char,short型,计算(int);
(5)long型,计算(int)(f ^ (f>>>32));
(6) float型,计算Float.floatToIntBits(afloat);
(7)double型,计算Double.doubleToLongBits(adouble)得到一个long,再执行[2.3];
(8)对象引用,递归调用它的hashCode方法;
(9)数组域,对其中每个元素调用它的hashCode方法。
(10)将上面计算得到的散列码保存到int变量c,然后执行result=37*result+c;
(11) 返回result。
4.当改写equals方法的时候,总是要改写hashCode方法,因为相同的对象必须具有相等的散列码,否则两个截然不同的对象可能在逻辑上相等,
你觉得这样行吗?
5.如果两个对象equals,那么这两个对象的hashcode相等,如果两个对象的hashcode相等,它们不一定equals。这要看它们有没有重写hashcode和equals方法。
原文出至:http://blog.csdn.net/lifetragedy/article/details/9751079