覆盖equals时总要覆盖hashcode

覆盖equals时总要覆盖hashcode

概述

在每个重载了equals方法的类中,也必须重载hashcode方法,这样才能保证HashMap,HashSet之类的征程工作;

约定

  • 如果同一个对象的信息没有被修改,hashcode方法应该始终如一返回同一个整数;
  • 两个对象在equals方法下相等,那么返回的hashcode也应该是相同的;
  • 两个对象在equals方法下不相等,hashcode不一定要不同,但不同的hashcode有助于hashtable的性能;

一个理想的散列函数应该“为不同的对象产生不相等的hash code”:

  1. 把非零常数值保存在result中;
  2. byte, char, short转换为(int)f;
  3. long类型,则计算(int)(f^f>>32);
  4. float类型,则计算Float.floatToInBits(f);
  5. double类型,则计算Double.doubleToLongBits(f);
  6. 如果是域的对象引用,则递归调用hashcode;
  7. 数组,则把每一个元素递归地调用hashcode方法调用这个值;或者利用Arrays.hashCode方法;

然后迭代地计算result = 31*result+c;

注意:必须排序equals计算中没有用到的域