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