【发布时间】:2010-09-12 20:02:17
【问题描述】:
在 Java 中,我有一个 Java3D 类 Point3f 的子类 Vertex。现在Point3f 根据其坐标值计算equals(),但是对于我的Vertex 类,我想要更严格:两个顶点只有在它们是同一个对象时才相等。到目前为止,一切顺利:
class Vertex extends Point3f {
// ...
public boolean equals(Object other) {
return this == other;
}
}
我知道这违反了equals() 的约定,但由于我只会将顶点与其他顶点进行比较,所以这不是问题。
现在,为了能够将顶点放入HashMap,hashCode() 方法必须返回与equals() 一致的结果。它目前是这样做的,但它的返回值可能基于Point3f 的字段,因此会为具有相同坐标的不同Vertex 对象提供哈希冲突。
因此,我想将hashCode() 基于对象的地址,而不是从Vertex 的字段中计算它。我知道Object 类会这样做,但我不能调用它的hashCode() 方法,因为Point3f 会覆盖它。
所以,实际上我的问题是双重的:
- 我还想要这么肤浅的
equals()吗? - 如果是,那么如何获取对象的地址来计算哈希码?
编辑:我只是想到了一些事情......我可以在对象创建时生成一个随机的int 值,并将其用于哈希码。这是一个好主意吗?为什么(不)?
【问题讨论】: