jwp*_*pol 1 java hash hashcode
我有一个与 java.lang.Object 中关于 hashCode 方法的广泛讨论主题相关的问题。只是有什么理由为什么我应该在某些用例中从 返回一个常量值hashCode()?
public int hashCode()
{
return 3;
}
Run Code Online (Sandbox Code Playgroud)
如果您找到一些直接回答我的问题的文章或 SO 线程,我将不胜感激。坦白说我做不到。
我的想法:
从docs.oracle.com 对象 hashCode()(我知道在 SO 中多次引用):
如果根据 equals(java.lang.Object) 方法两个对象不相等,则不需要对这两个对象中的每一个调用 hashCode 方法必须产生不同的整数结果。但是,程序员应该意识到为不相等的对象生成不同的整数结果可能会提高哈希表的性能。”
所以理论上hashCode()可以返回一个常数值。在我的想象和我读过的内容中,当使用例如HashMap. 举个例子,假设 1000 个元素将被放置在完全相同的哈希桶中(换句话说,将有 1000 次冲突),并在错误的情况下找到特定的元素,即必须迭代 1000 个元素。然后它将执行类似于LinkedList收集(如果我错了请纠正我)。
基于上述,hashCode()可以返回一个常量值,但它会破坏使用hash...集合获得的性能。那么在某些特定示例中这样做是否有意义?
编辑:我发现了一个hashCode基于 Vlad 的 Mihalcea 文章的具有常量方法的特定示例:How to implement equals and hashCode using JPA entity identifier , (Hibernate)。HashCode 在实体状态转换之间有所不同,因此它应该返回常量值。引自文章:
当实体第一次存储在 Set 中时,标识符为空。实体持久化后,标识符被分配给自动生成的值,因此 hashCode 不同。因此,实体在持久化后无法在 Set 中找到。
所以有一个实际的例子,但正如它以性能为代价所指出的那样。如果除了entity id之外还有一个业务唯一的非空标识符,最好使用它,以便利用多个Hash...bucket中存储实体的优势。
通常,在覆盖哈希码时,您永远不会返回静态成员。我以前从未这样做过,但我什至可以想象的唯一可能用例是单例,您希望运行时只有 1 个未延迟初始化的实例。这有点无用,因为如果您将类设计为使用单例模式,则永远不需要使用 equals/hashcode。
| 归档时间: |
|
| 查看次数: |
327 次 |
| 最近记录: |