@Override public int hashCode() { int h = 17; // 非基本数据类型 h = 31 * h + (f1 == null ? 0 : f1.hashCode()); // boolean h = 31 * h + (f2 ? 1 : 0); // byte、char、short、int h = 31 * h + (int)f3; // long h = 31 * h + (int)(f4 ^ (f4 >>> 32)); // float h = 31 * h + Float.floatToIntBits(f5); // double long f6l = Double.doubleToLongBits(f6) h = 31 * h + (int)(f6l ^ (f6l >>> 32)); // long 型算法 /* 数组类型,各种基本数据类型的数组和Object数组. java.util.Arrays重载了九个hashCode()方法用于计算各种类型数组的hashCode, 它会计算数组中每个元素的hashCode,算法与上面相同. */ h = 31 * h + Arrays.hashCode(arr); return h; }
上面每个字段的 hashCode 为什么要乘一个数呢?是为了使 hashCode值依赖于字段顺序,比如 Test 类中只有两个int型字段,乘一个数会使new(2, 3) 与 new(3, 2) 的 hashCode 不一样。
那为什么要乘 31 呢?这是为了运算高效,任何数乘 31 可以被 JVM 优化为位运算 (n << 5) - n ,它比乘法运算高效的多。