首頁 >Java >java教程 >為什麼Java在String的hashCode()中要使用31作為乘數?

為什麼Java在String的hashCode()中要使用31作為乘數?

DDD
DDD原創
2024-12-19 17:07:10887瀏覽

Why Does Java Use 31 as the Multiplier in String's hashCode()?

深入探究Java 的String 的hashCode() 31 乘數背後的推理

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn