为基于值的类预先计算hashCode吗?

Gla*_*ins 5 java hashcode

基于值的类具有以下特性

是最终的且不可变的(尽管可能包含对可变对象的引用)。

因此,如果您知道对象仅包含不可变的实例,则可以预先计算hashCode实例的。使用MapSet操作时,这可以加快访问速度。

hashCodeInstant基于值的类from 的实现看,开发人员为什么决定反对这种模式?hashCode与需要一遍又一遍地进行计算相比,预计算的性能损失是否会更加严重?

// copied from Instant#hashCode
@Override
public int hashCode() {
    return ((int) (seconds ^ (seconds >>> 32))) + 51 * nanos;
}
Run Code Online (Sandbox Code Playgroud)

那么,在什么条件下预先计算hashCode合理的呢?

Jat*_*tin 4

Instant没有缓存的直接原因hashcode. 但我能想到的一些:

缓存hashcode是有代价的:声明的实例变量:

  • 当然,每个对象占用更多的内存。重新计算哈希码可能比为每个实例对象分配额外的内存更好
  • 担心序列化/反序列化,因为需要保留实例变量。增加序列化对象的大小
  • 内部实现在未来的版本中变得很难修改。尤其是由于过去的序列化对象。对于过去的版本对象来说,保持向后兼容性变得很困难。额外维护。
  • hashcode可能永远不会在 Instant 对象上调用。在这种情况下,我们会浪费 CPU 来计算从未使用过的东西

所以缓存可能没有意义。也许它是有意义的,String因为它在整个过程中都很常用。也许值得头痛。