簡體   English   中英

Java - Point類的hashCode()方法是否有用,或者我應該覆蓋它並自己編寫?

[英]Java - Is the Point class's hashCode() method any good, or should I override it and write my own?

有沒有辦法真正看到標准java類的源代碼? 我正在制作一個點哈希表( HashSet<Point> ),我想確保它會很好地散列,但我看不出Point的hashCode()方法實際上是什么樣的,所以我不知道怎么做真的很棒。 誰能幫我? 我應該覆蓋它嗎? 如果是這樣,有沒有一個簡單的方法來做到這一點,而無需創建一個全新的java文件/類?

如果您正在搜索java.awt.PointhashCode() ,則它在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,位於JDK目錄中的src.zip文件中。 如果不是,那么獲取它的方式將取決於您正在使用的Java版本。 例如, 這里提供完整的JDK 6源代碼,或者JDK 7有一個單獨的源代碼下載頁面,其中包含各種選項。

至於散列有多好 - 為什么不用實際點的樣本來測試呢? 始終存在碰撞的可能性,但它們是否真的發生將取決於您的數據。 在您的情況下找出散列無沖突的一種簡單方法是使用來自GuavaMultiset - 將每個點的哈希碼添加到集合中,然后基本上為您提供每個哈希碼的頻率。

說實話,我期望的散列算法是一般用途相當合理。 但如果您擔心,測試總是一個好主意。

Java源代碼隨src.zip文件中的JDK一起提供。 請注意, PointhashCode()在其父級java.awt.geom.Point2D定義。

如果您認為現有的實現不符合您的標准,您可能更喜歡使用“動態”定義的匿名類來覆蓋hashCode方法:

Point myPoint = new Point() {

    public int hashCode() {
        // custom implementation
    }

}; // <-- note required semicolon

這樣您就不必創建新文件。

轉到此鏈接並搜索Java SE 6 JDK Source Code 下載源代碼並自行閱讀。 我懷疑你會做得更好,但懷疑是好的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM