重写hashCode()方法的基本规则
a、注意事项
1、同一个对象多次调用hashCode()方法应该返回相同的值
2、两个对象通过equals()方法比较返回true时,这两个对象的hashCode()方法应返回相等的值
3、对象中用作equals()方法比较标准的Field,都应该用来计算hashCode值
b、计算步骤
1、各数据类型field的计算方式
Field类型 | 计算方式 |
boolean | hashCode = (f?0:1); |
整数类型(byte、short、char、int) | hashCode = (int)f; |
long | hashCode = (int)(f^(f>>>32)); |
float | hashCode = Float.floatToIntBits(f); |
double | long l = Double.doubleToLongBits(f); hashCode = (int)(l^(l>>>32)); |
普通引用类型 | hashCode = f.hashCode(); |
2、用第1步计算出来的多个hashCode值组合计算出一个hashCode值返回,如:
return f1.hashCode() + (int)f2;
3、为了避免直接相加产生偶然相等(两个对象的f1、f2 Field并不相等,但它们的和恰好相等),可以为各Field乘以任意一个质数后再相加。如:
return f1.hashCode() * 17 + (int)f2 * 13;