我有以下来自 Joshua Bloch 的有效 java 的代码(第 9 项,第 3 章,第 49 页)
如果一个类是不可变的并且计算哈希码的成本很高,您可能会考虑在对象中缓存哈希码,而不是在每次请求时重新计算它。如果您认为大多数此类对象将用作哈希键,那么您应该在创建实例时计算哈希码。否则,您可能会选择在第一次调用 hashCode 时延迟初始化它(Item 71)。尚不清楚我们的 PhoneNumber 类是否值得这种处理,只是为了向您展示它是如何完成的:
// Lazily initialized, cached hashCode
private volatile int hashCode; // (See Item 71)
@Override public int hashCode() {
int result = hashCode;
if (result == 0) {
result = 17;
result = 31 * result + areaCode;
result = 31 * result + prefix;
result = 31 * result + lineNumber;
hashCode = result;
}
return result;
}
我的问题是缓存(记住 hashCode)如何在这里工作。第一次hashCode()
调用方法,没有hashCode
将其分配给结果。关于这种缓存如何工作的简要说明会很棒。谢谢