Java-是Point类';s hashCode()方法有什么好处,还是应该重写它并编写自己的?

Java-是Point类';s hashCode()方法有什么好处,还是应该重写它并编写自己的?,java,hashcode,point,hashset,Java,Hashcode,Point,Hashset,顺便问一下,有没有办法真正看到标准java类的源代码?我正在制作一个点的哈希表(HashSet),我想确保它能够很好地进行哈希,但我看不出Point的hashCode()方法实际上是什么样子,所以我不知道它到底有多好。有人能帮我吗?我应该覆盖它吗?如果是这样的话,有没有一种不创建全新java文件/类的简单方法 顺便问一下,有没有办法真正看到标准java类的源代码 是的-我相信它通常随JDK一起提供,位于JDK目录中的src.zip文件中。如果不是,那么获得它的方法将取决于您使用的Java版本。例

顺便问一下,有没有办法真正看到标准java类的源代码?我正在制作一个点的哈希表(
HashSet
),我想确保它能够很好地进行哈希,但我看不出Point的hashCode()方法实际上是什么样子,所以我不知道它到底有多好。有人能帮我吗?我应该覆盖它吗?如果是这样的话,有没有一种不创建全新java文件/类的简单方法

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

是的-我相信它通常随JDK一起提供,位于JDK目录中的src.zip文件中。如果不是,那么获得它的方法将取决于您使用的Java版本。例如,完整的JDK 6源代码是可用的,或者JDK 7有一个带有各种选项的单独的源代码

至于散列有多好,为什么不用实际点的样本来测试它呢?碰撞的可能性总是存在的,但它们是否真的发生将取决于您的数据。在你的例子中,找出散列有多无冲突的一个简单方法是使用from-将散列代码从每个点添加到集合中,然后基本上会给出每个散列代码的频率


老实说,我希望哈希算法对于一般用途来说是相当合理的。但是如果你担心的话,测试总是一个好主意。

转到这里,搜索
JavaSE6JDK源代码。下载源代码并亲自阅读。我怀疑你会做得更好,但持怀疑态度是好的。

如果你正在搜索
java.awt.Point
hashCode()
,它在
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)。

Java源代码随JDK一起出现在
src.zip
文件中请注意,
Point
hashCode()
是在其父级
java.awt.geom.Point2D
中定义的

如果您认为现有的实现不符合您的标准,您可能更愿意使用定义为“动态”的匿名类重写
hashCode
方法:

Point myPoint=新点(){
公共int hashCode(){
//自定义实现
}

}; // 我不知道其他IDE,但在Eclipse中,您可以将源代码附加到Java的库中。窗口->首选项->Java->已安装的JRE->选择JAR->源附件。导航到您使用JDK(或跟随Jon Skeet的链接)获得的src.zip,然后看。源代码位于JDK目录中的
src.zip
。您也可以使用google>java awt点源代码,第一个搜索结果很可能是类的完整源代码:-),这是一个不错的哈希代码实现。这不是我所说的防止蓄意攻击的安全措施,但非常适合日常使用。@Louis Wasserman:请注意,我并没有说它不好,我指的是Tim的问题“我想确保它能正常运行”。我相信人们不应该触碰预先定义的行为,它们应该足够普遍。根据我的经验,在分析之后,它总是归结为导致瓶颈的代码的其他部分。哈希冲突是现实。。。例如,pastebin.com/6wM3W3Wv
Point myPoint = new Point() {

    public int hashCode() {
        // custom implementation
    }

}; // <-- note required semicolon