以下总结自effective java.
实现equals方法的过程如下:
1 使用==运算符来判断是否引用同一个对象。
2 使用instance of操作符来判断参数是否是正确的类型。
3 将实参cast成正确的类型。
4 对于每个关键属性,进行比较:
对于非float或double的primitive类型,使用==判断等价性;
对于floa类型,先使用Float.floatToIntBits转换成int类型,然后使用==比较int类型的值;
对于double类型,先使用Double.doubleToLongBits转换成long类型,然后使用==比较long类型;
对于对象引用,递归的调用equals方法。
对于数组类型,对其中的元素进行上述的操作,或者使用Arrays.equals方法(version 1.5)。
为了避免NPE,可以使用
field == null ? o.field == null : fleld.equals(o.field);
重写hashCode方法如下:
1 把某个非零常数值,例如17,保存在int变量result中;
2 对于对象中每一个关键域f(指equals方法中考虑的每一个域),计算散列码c:
2.1 boolean型,计算(f ? 0 : 1);
2.2 byte,char,short型,计算(int);
2.3 long型,计算(int) (f ^ (f>>>32));
2.4 float型,计算Float.floatToIntBits(f);
2.5 double型,计算Double.doubleToLongBits(f)得到一个long,再执行[2.3];
2.6 对象引用,递归调用它的hashCode方法;
2.7 数组域,对其中每个元素按照上面的规则计算hash code。
3 将上面计算得到的散列码保存到int变量c,然后执行 result=37*result+c;
4 返回result。