Effective Java Sencond Edition

Effective Java 第9条: 覆盖 equals 时总

2019-01-03  本文已影响0人  linyk3

在每个覆盖了equals 方法的类中,也必须覆盖 hashCode 方法.
否则违反Object.hashCode 通用规定,从而导致无法结合所有基于散列的集合一起正常运作.

Object.hashCode 约定的内容:

一个好的散列函数通常倾向于:为不相等的对象产生不相等的散列码.
简单的hash方法:

缓存hashCode,并延迟初始化:

private volatile int hashCode;
// equals 方法比较涉及的三个域: short areaCode, short prefix, short lineNumber
@Override 
public int hashCode() {
    int result = hashCode;
    if (result == null) {
        result = 17;
        result = 31 * result * areaCode;
        result = 31 * result * prefix;
        result = 31 * result * lineNumber;
        hashCode = result;
    }
    return result;
}

**不要试图从散列码计算中排除一个对象的关键部分来提高性能.这样虽然计算hashCode可能会快一点,但是hash表不一定好.

上一篇 下一篇

猜你喜欢

热点阅读