Java - Point类的hashCode()方法是否有用,或者我应该覆盖它并自己编写?

时间:2012-02-12 19:31:05

标签: java hashcode point hashset

有没有办法真正看到标准java类的源代码?我正在制作一个点(HashSet<Point>)的哈希表,我想确保它会很好地散列,但我看不出Point的hashCode()方法实际上是什么样的,所以我不知道真的有多好。谁能帮我?我应该覆盖它吗?如果是这样,有没有一种简单的方法可以在不创建全新的java文件/类的情况下执行此操作?

4 个答案:

答案 0 :(得分:8)

如果您正在搜索hashCode() java.awt.Point,则会在java.awt.geom.Point2D中定义。

/**
 * Returns the hashcode for this <code>Point2D</code>.
 * @return      a hash code for this <code>Point2D</code>.
 */
public int hashCode() {
    long bits = java.lang.Double.doubleToLongBits(getX());
    bits ^= java.lang.Double.doubleToLongBits(getY()) * 31;
    return (((int) bits) ^ ((int) (bits >> 32)));
}

请注意,问题“它会干好吗?”很难回答,主要取决于使用模式。

您可以访问几乎所有“标准Java类”的源代码,只需在JDK安装目录中搜索src.zip文件(或使用Eclipse / NetBeans等IDE)单击类名称上的F3。

答案 1 :(得分:3)

  

顺便说一下,有没有办法真正看到标准java类的源代码?

是的 - 我相信它通常带有JDK,位于JDK目录中的src.zip文件中。如果不是,那么获取它的方式将取决于您正在使用的Java版本。例如,完整的JDK 6源可用here,或者JDK 7具有单独的source code download page,具有各种选项。

关于哈希的好坏 - 为什么不用你的实际点的样本来测试呢?始终存在碰撞的可能性,但它们是否真的发生将取决于您的数据。在您的情况下找出散列无碰撞的一种简单方法是使用Multiset中的Guava - 将每个点的哈希码添加到集合中,然后基本上给出你是每个哈希码的频率。

说实话,我希望哈希算法对于通用目的来说非常合理。但如果您担心,测试总是一个好主意。

答案 2 :(得分:3)

Java源代码随src.zip文件中的JDK一起提供。 请注意,Point的{​​{1}}已在其父级hashCode()中定义。

如果您认为现有的实施不符合您的标准,您可能更愿意使用“动态”定义的匿名类覆盖java.awt.geom.Point2D方法:

hashCode

这样您就不必创建新文件了。

答案 3 :(得分:1)

转到此link并搜索Java SE 6 JDK Source Code。下载源代码并自行阅读。我怀疑你会做得更好,但怀疑是好的。