首頁 > Java > java教程 > 為什麼Java的`String.hashCode()`要用31作為它的乘數?

為什麼Java的`String.hashCode()`要用31作為它的乘數?

Mary-Kate Olsen
發布: 2024-12-19 10:46:11
原創
673 人瀏覽過

Why Does Java's `String.hashCode()` Use 31 as its Multiplier?

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

在Java 中,String 物件的hashCode() 方法採用以下方式公式:

其中s[i] 是第i 個字符,n是字串長度,^ 表示求冪。這就提出了一個問題:為什麼專門選擇 31 作為乘數?

素數乘數的基本原理

文件建議使用相對較大的素數作為乘數來最大限度地減少哈希表中的衝突。當不同的物件產生相同的雜湊碼時,就會發生衝突,可能會導致效能問題。素數提供了更好的雜湊碼分佈,減少了衝突的可能性。

為什麼不是其他質數?

在其他素數中選擇31 個歸因於兩個因素:

  1. 溢出預防:如果乘數是偶數且乘法溢出,資訊將會遺失。這是因為乘以 2 相當於移位運算。
  2. 效能最佳化: 值 31 允許進行最佳化,其中乘法可以替換為移位和減法: 31 * i = =(i<<5)-i。現代虛擬機器自動執行此最佳化。

因此,31 滿足作為素數的兩個標準,以防止衝突,同時為 Java 中的 String 物件實作高效的雜湊操作。

以上是為什麼Java的`String.hashCode()`要用31作為它的乘數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板