2011-08-03 150 views
2

可能重複:
Why does Java's hashCode() in String use 31 as a multiplier?重載hashCode最佳實踐

@Override public int hashCode() { 
    int result = 17 + hashDouble(re); 
    result = 31 * result + hashDouble(im); 
    return result; 
} 

這是 「有效的Java」 的代碼。它廣泛用於企業應用程序嗎?我很擔心添加靜態值。或者我們應該將17和31定義爲某種Utility類中的最終變量,並從那裏引用它們?

也可以有人解釋這些數字是什麼? 31只是一個隨機選擇的素數?

回答

0

是的,我總是看到這樣的代碼。

我認爲這種做法沒有任何問題,我也沒有看到有利於將常量分解到外部類中(請注意,在程序運行時,值顯然不能改變)。

這些數字是可能在某種程度上被任意選擇的質數。

我沒有有效的Java手,但我發現下面的話:選擇

值31,因爲它是一個奇素數。如果它甚至是 並且乘法溢出,信息將會丟失,因爲 乘以2相當於移位。使用 素數的優點不太清楚,但它是傳統的。 31的一個不錯的屬性是 ,乘法可以被移位和減法 替代以獲得更好的性能:31 * i ==(i < < 5) - i。現代虛擬機會自動執行這種優化。