这是第 9 项中的示例代码:
public final class PhoneNumber {
private final short areaCode;
private final short prefix;
private final short lineNumber;
@Override
public int hashCode() {
int result = 17;
result = 31 * result + areaCode;
result = 31 * result + prefix;
result = 31 * result + lineNumber;
return result;
}
}
第 48 页指出:“选择值 31 是因为它是一个奇数素数。如果它是偶数并且乘法溢出,信息将会丢失,因为乘以 2 相当于移位。”
我理解乘以 2 的概念相当于位移。我也知道当我们将一个大数乘以一个大奇数素数时,我们仍然会出现溢出(因此信息丢失)。我不明白为什么由大奇数乘法引起的信息丢失比由大偶数乘法引起的信息丢失更可取。