重写hashCode方法

@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 ,它比乘法运算高效的多。

 

posted @ 2019-09-23 16:49  LinuSiyu  阅读(495)  评论(0编辑  收藏  举报