Java 的String 實作採用特定的公式來計算雜湊碼:
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
其中s[i] 表示字串的第i 個字符,n 表示其長度,^表示求冪。然而,一個相關的問題出現了:為什麼乘數設定為 31?
這個選擇源自於 Joshua Bloch 的著名著作《Effective Java,第二版》中所概述的原則。 Bloch 的基本原理圍繞著乘數的兩個關鍵標準:它應該是一個相對較大的質數。
奇數素數乘數的好處
Bloch 強調使用像31這樣的奇素數乘法器可以確保乘法運算不會因溢出而導致資訊遺失。如果乘數是偶數,則可能會發生溢出,並且由於乘以 2 類似於移位,因此關鍵資訊可能會受到損害。
素數乘數的微妙優勢
雖然選擇質數乘數的具體優勢不太明顯,但它符合慣例。值得注意的是,31 擁有一個獨特的屬性:它允許將乘法有效地替換為移位和減法,從而提高效能。這種最佳化通常由現代虛擬機器 (VM) 自動執行。
共識
綜上所述,Java 使用 31 作為 String 的 hashCode() 方法的乘數源自於它作為奇素數的地位。這種選擇可以防止由於溢出而丟失信息,並通過用移位和減法代替乘法來增強性能。
以上是為什麼Java在String的hashCode()中要使用31作為乘數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!