Java集合中的缓存哈希?

Cep*_*pod 1 java collections hash

当我实现一个使用哈希来优化访问的集合时,我应该缓存哈希值还是假设一个有效的实现hashCode()

另一方面,当我实现一个覆盖的类时,我hashCode()应该假设集合(即HashSet)缓存哈希吗?

这个问题只涉及性能与内存开销.我知道对象的哈希值不应该改变.

澄清: 可变对象当然必须在更改时清除缓存的值,而集合依赖于不更改的对象.但这与我的问题无关.

Kev*_*ion 7

在设计Guava ImmutableSetImmutableMap类时,我们选择缓存哈希码.这样,只有当您足够关心自己进行缓存时,您才能从哈希码缓存中获得更好的性能.如果我们自己缓存它们,即使你非常关心速度和空间,我们也会花费你额外的时间和记忆!

这是真的,HashMap这个缓存,但它HashMap的作者(乔什布洛赫)强烈建议我们不遵循这个先例!

编辑:哦,另外,如果你hashCode()的速度很慢,集合的缓存只能解决问题的一半,因为无论如何都hashCode()必须在传入的对象上调用get().