1. 程式人生 > >為什麼在定義hashcode時要使用31這個數呢?

為什麼在定義hashcode時要使用31這個數呢?

public int hashCode() { 

int h = hash; 
  int len = count; 
  if (h == 0 && len > 0) { 
  int off = offset; 
  char val[] = value; 
  for (int i = 0; i < len; i++) { 
     h = 31*h + val[off++]; 
   } 
  hash = h; 
  } 
  return h; 

該函式是我看的函式介面原始碼,為什麼要使用31這個數呢?

其實上面的實現也可以總結成數數裡面下面這樣的公式:

s[0]*31^(n-1) + s[1]*31^(n-2) + … + s[n-1]

原因如下:

A.31是一個素數,素數作用就是如果我用一個數字來乘以這個素數,那麼最終的出來的結果只能被素數本身和被乘數還有1來整除!。(減少衝突)

B.31可以 由i*31== (i<<5)-1來表示,現在很多虛擬機器裡面都有做相關優化.(提高演算法效率)

C.選擇係數的時候要選擇儘量大的係數。因為如果計算出來的hash地址越大,所謂的“衝突”就越少,查詢起來效率也會提高。(減少衝突)

D.並且31只佔用5bits,相乘造成資料溢位的概率較小。

相關推薦

為什麼在定義hashcode使用31個數

public int hashCode() {  int h = hash;   int len = count;   if (h == 0 && len > 0) {   int off = offset;   char val[] = value;   for (int i = 0

定義資料表考慮的要素

定義資料表時要考慮的要素 建立一張資料表時一般有以下要素要考慮: 列: 欄位型別 是否為空 是否自增 預設值 鍵: 主鍵 外來鍵 唯一鍵(也可能是多個 filed 組成的) 觸發器(就是自動呼叫的儲存過程

定義數據表考慮的要素

存儲 code 調用 數據 字符 字段 要素 自動調用 主鍵 定義數據表時要考慮的要素 創建一張數據表時一般有以下要素要考慮: 列: 字段類型 是否為空 是否自增 默認值 鍵: 主鍵 外鍵 唯一鍵(也可能是多個 filed 組成的) 觸發器(就是自動調用的存儲過程

C++中帶有預設引數的宣告和定義。Qt中重寫預設建構函式。C++中函式呼叫實參個數和函式定義的形參個數不一致的處理。

1、Qt中自動生成的建構函式 (1)Qt中自動生成的建構函式的宣告 class Chat : public QWidget { Q_OBJECT public: explicit Chat(QWidget *parent = 0); //宣告建構函式,可以帶有初始值“=0”

我到底選擇一種什麼樣的生活方式,度過一輩子 人生自由與職業發展方向 下

上篇,主要探討了農民、工人、老闆、官員等幾種職業的一些特點。本篇,重點關注我對未來的預期和個人的選擇。第1種選擇     選擇一家或多家中小型公司,短期內專注技術,尤其是Java Web領域技術,不斷加強對電商、網際網路產品等都統領域業務的理解。從開發工程師-技術骨幹,可能做到技術架構師或技術負責人之類的角色

Python定義為什麽繼承object類

quest __name__ clas python 廣度 main 存在 推薦 多繼承 繼承 object 類的是新式類,不繼承 object 類的是經典類,在 Python 2.7 裏面新式類和經典類在多繼承方面會有差異: #新式類 class A(object):

Python定義為什麼繼承object類

繼承 object 類的是新式類,不繼承 object 類的是經典類,在 Python 2.7 裡面新式類和經典類在多繼承方面會有差異: #新式類 class A(object): def foo(self): print 'called A.foo()' class B(A

更改一個數據中的某一位的狀態可使用異或直接操作

 例如 想更改1100 1001 中的第三位  可以將其與 0000 1000進行異或操作   1100 1001 ^ 0000 1000 = 1100 0001  這在微控制器開發中應用非常常見  另外,想要將某一位置一的時候就使用或 | 1  置零使用 &0

我到底選擇一種什麼樣的生活方式,度過一輩子:人生自由與職業發展方向(下)

上篇,主要探討了農民、工人、老闆、官員等幾種職業的一些特點。本篇,重點關注我對未來的預期和個人的選擇。第1種選擇     選擇一家或多家中小型公司,短期內專注技術,尤其是Java Web領域技術,不斷加強對電商、網際網路產品等都統領域業務的理解。從開發工程師-技術骨幹,可能做到技術架構師或技術負責人之類的角色

定義屬性NSArray,NSString,NSDictionary為何用copy

新人一枚,第一次寫部落格,有寫錯的敵方請見諒,一定認真改正。進入正題: 剛開始學習property的時候沒有太認真學這一段,就那麼幾種型別,對應著寫就完事了,也沒想太多,最近腦袋欠抽了,突然考慮了一下這個問題,為什麼NSArray,NSString,NSDictionary

為什麼繼承HttpSevlet類不需要重寫service 而重寫doGet doPost

在學習Servlet的過程中,我們大多時候編碼都是直接繼承HttpServlet這個類,並且重寫doGet ,doPost,但是檢視Api時我們會發現Servlet介面 ,GenericSevlet抽象類 以及HttpServlet類中都有service方法,那麼為什麼我們繼

IIS ajax CORS 訪問發送自定義Header分析

nbsp post true cal 後臺 config -a coo function 場景: a站:http://127.0.0.1/a b站:http://localhost/b (IIS7.5) a站用ajax訪問b的資源,代碼如下: $.ajaxSetu

遇到問題或bug做的事。

後臺 除法 兼容問題 開發 問題 代碼 分析 減少 請求 1,做事細心,只有細心才能減少bug量,做總結。 2,開發中遇到bug和錯誤,第一要想到是程序代碼的問題。而首先想到的不是其他問題(比如版本,框架或兼容問題等)。 3,程序不能按照自己的意願執行,時先看控制臺有沒

Struts2配置攔截器自定義拋異常:Unable to load configuration. - interceptor-ref - file:/D:/tomcat_install/webapps/crm/WEB-INF/classes/struts.xml

註意 其他 默認 才會 eba staf -i sta fault 代碼如下: <interceptors> <!-- 註冊自定義攔截器 --> <interceptor name="LoginInterceptor" class="co

自己定義View,用到Paint Canvas的一些溫故,簡單的幀動畫(動畫一 ,&quot;掏糞男孩Gif&quot;順便再提提onWindowFocusChanged)

eat android 內容 rri generated 簡單的 fadein spl onclick 轉載請註明出處:王亟亟的大牛之路 之前在繪畫的過程中提到了靜態的旋轉啊,縮放啊,平移等一些效果。那麽自己定義的View當然也有動態的效果也就是我們的

想成為千萬富翁?首先你做到14件事

體會 開始 貢獻 是你 增長 robert 為什麽 一起 存在 將你收入中的至少10%用於自我投資,將你至少80%的業余時間用於學習 成為千萬富翁的最大價值不在於這千萬的財富,而在於一個通過賺取千萬財富的過程使自己成為了一個更加傑出的人。 —商業哲學家Jim Roh

Java 《Effective Java 中文版 第2版》學習筆記 遇到多個構造器考慮用構建器

fec 利用 客戶端代碼 except car beans pri 很好 種類   靜態工廠和構造器有個共同的局限性:它們都不能很好地擴展到大量的可選參數。   當一個類中有若幹個必選屬性和多個可選屬性時,采用重疊構造器模式、JavaBeans模式或者Builder模式,但

同構數(“同構數”是指這樣一種數,個數右端的數平方後會得到個數本身)

nbsp amp 所有 div 輸入數據 for 輸入 概念 pre 一、題目: “同構數”是指這樣一種數,這個數右端的數平方後會得到這個數本身。例如,5是25 右邊的數,25是625右邊的數,25和625都是同構數。找出a ~ b之間全部同構數。 Input 有多組數

php 通過curl獲取遠程數據,返回的是一個數組型的字符串,高手幫忙如何將個數組類型的字符串變成數組。

bsp 選項 con 獲取 pan 如果 clas exe transfer 如 Array([0] => Array([0] => Array([kd_status] => 已簽收[kd_time] => 2014-04-30 18:59:43 [

用靜態工廠方法代替構造器、遇到多個構造器參數考慮用構建器

泛型 不用 推斷 frame public 多參數 eof ram api 一、用靜態工廠方法代替構造器 類通過共有的構造方法可以提供很大的優點:1、構造方法可一有不同的名字,我們可以通過名字區分構造什麽樣子的對象,而構造器名字相同,當參數列表的數目相同 順序不同時 很大的