基于值的类具有以下特性
是最终的且不可变的(尽管可能包含对可变对象的引用)。
因此,如果您知道对象仅包含不可变的实例,则可以预先计算hashCode实例的。使用Map或Set操作时,这可以加快访问速度。
hashCode从Instant基于值的类from 的实现看,开发人员为什么决定反对这种模式?hashCode与需要一遍又一遍地进行计算相比,预计算的性能损失是否会更加严重?
// copied from Instant#hashCode
@Override
public int hashCode() {
return ((int) (seconds ^ (seconds >>> 32))) + 51 * nanos;
}
Run Code Online (Sandbox Code Playgroud)
那么,在什么条件下预先计算是hashCode合理的呢?
Instant没有缓存的直接原因hashcode. 但我能想到的一些:
缓存hashcode是有代价的:声明的实例变量:
hashcode可能永远不会在 Instant 对象上调用。在这种情况下,我们会浪费 CPU 来计算从未使用过的东西所以缓存可能没有意义。也许它是有意义的,String因为它在整个过程中都很常用。也许值得头痛。
| 归档时间: |
|
| 查看次数: |
73 次 |
| 最近记录: |