覆盖equals时总要覆盖hashcode
概述
在每个重载了equals方法的类中,也必须重载hashcode方法,这样才能保证HashMap,HashSet之类的征程工作;
约定
- 如果同一个对象的信息没有被修改,hashcode方法应该始终如一返回同一个整数;
- 两个对象在equals方法下相等,那么返回的hashcode也应该是相同的;
- 两个对象在equals方法下不相等,hashcode不一定要不同,但不同的hashcode有助于hashtable的性能;
一个理想的散列函数应该“为不同的对象产生不相等的hash code”:
- 把非零常数值保存在result中;
- byte, char, short转换为(int)f;
- long类型,则计算(int)(f^f>>32);
- float类型,则计算Float.floatToInBits(f);
- double类型,则计算Double.doubleToLongBits(f);
- 如果是域的对象引用,则递归调用hashcode;
- 数组,则把每一个元素递归地调用hashcode方法调用这个值;或者利用Arrays.hashCode方法;
然后迭代地计算result = 31*result+c;
注意:必须排序equals计算中没有用到的域