[英]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.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,位於JDK目錄中的src.zip文件中。 如果不是,那么獲取它的方式將取決於您正在使用的Java版本。 例如, 這里提供了完整的JDK 6源代碼,或者JDK 7有一個單獨的源代碼下載頁面,其中包含各種選項。
至於散列有多好 - 為什么不用實際點的樣本來測試呢? 始終存在碰撞的可能性,但它們是否真的發生將取決於您的數據。 在您的情況下找出散列無沖突的一種簡單方法是使用來自Guava的Multiset - 將每個點的哈希碼添加到集合中,然后基本上為您提供每個哈希碼的頻率。
說實話,我期望的散列算法是一般用途相當合理。 但如果您擔心,測試總是一個好主意。
Java源代碼隨src.zip
文件中的JDK一起提供。 請注意, Point
的hashCode()
在其父級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.