String 類的方法 -- hashCode()實現(xiàn)的常量系數(shù) 為什么是31

先上源碼:

/**

* Returns a hash code for this string. The hash code for a

* {@code String} object is computed as

* <blockquote><pre>* s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

* </pre></blockquote> * using {@code int} arithmetic, where {@code s[i]} is the

* <i>i</i>th character of the string, {@code n} is the length of

* the string, and {@code ^} indicates exponentiation.

* (The hash value of the empty string is zero.)

*

* @return? a hash code value for this object.

*/

public int hashCode() {

int h =hash;

if (h ==0 &&value.length >0) {

char val[] =value;

for (int i =0; i

h =31 * h + val[i];

}

hash = h;

}

return h;

}

相信很多朋友跟我一樣栋猖,在查看String 類中hashCode() 方法具體實現(xiàn)的時候荤崇,會有個一疑問该押,為什么會有個常量系數(shù) 31,這個31是什么向图,怎么來的?有什么具體的含義祥楣;然后就各種查类垫;

我也是簡單的查了一下,網(wǎng)上的對這個解讀的資料還是蠻多的此衅,很輕松的找到可答案强戴;

整理了一下亭螟,主要是有一下幾種原因:

1、31是素數(shù)骑歹,素數(shù)是什么预烙?素數(shù)也是質(zhì)數(shù),除了1和它本身以外道媚,沒有其他因數(shù)扁掸。所以不能被其他自然數(shù)整除

2、在存儲數(shù)據(jù)計算hash地址的時候最域,我們希望相同的hash地址越少越好谴分,也就是所謂的“沖突”,因為相同的hash地址的數(shù)據(jù)越多镀脂,生成的hash鏈表就越長狸剃,查找數(shù)據(jù)遍歷的時間就越長,從而降低了查詢效率狗热。所以在選擇系數(shù)的時候钞馁,我們希望這個系數(shù)越大越好(hash地址越大,沖突的概率越小匿刮,查詢效率就高)僧凰,但是相乘最好不要溢出(系數(shù)越大,越容易造成數(shù)據(jù)溢出熟丸,溢出的話训措,會造成數(shù)據(jù)的丟失)。而 31= 11111【二進(jìn)制】光羞,只占5bits绩鸣。

3、我們都知道纱兑,計算機(jī)的乘法涉及到移位計算呀闻,一個數(shù)*2直接將這位數(shù)往左移一位即可,31*i = 2^5 * i - i, 相當(dāng)于 i 向 左移動5位潜慎,再減 i捡多,這樣就轉(zhuǎn)化成移位和減法結(jié)合的計算,比直接相乘的速度更快铐炫。也算是對算法的一種優(yōu)化

綜合以上幾個原因垒手,選擇了31這個系數(shù)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末倒信,一起剝皮案震驚了整個濱河市科贬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鳖悠,老刑警劉巖榜掌,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件优妙,死亡現(xiàn)場離奇詭異,居然都是意外死亡唐责,警方通過查閱死者的電腦和手機(jī)鳞溉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鼠哥,“玉大人熟菲,你說我怎么就攤上這事∑涌遥” “怎么了抄罕?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長于颖。 經(jīng)常有香客問我呆贿,道長,這世上最難降的妖魔是什么森渐? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任做入,我火速辦了婚禮,結(jié)果婚禮上同衣,老公的妹妹穿的比我還像新娘竟块。我一直安慰自己,他們只是感情好耐齐,可當(dāng)我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布浪秘。 她就那樣靜靜地躺著,像睡著了一般埠况。 火紅的嫁衣襯著肌膚如雪耸携。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天辕翰,我揣著相機(jī)與錄音夺衍,去河邊找鬼。 笑死金蜀,一個胖子當(dāng)著我的面吹牛刷后,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播渊抄,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼丧裁!你這毒婦竟也來了护桦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤煎娇,失蹤者是張志新(化名)和其女友劉穎二庵,沒想到半個月后贪染,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡催享,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年杭隙,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片因妙。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡痰憎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出攀涵,到底是詐尸還是另有隱情铣耘,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布以故,位于F島的核電站蜗细,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏怒详。R本人自食惡果不足惜炉媒,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望昆烁。 院中可真熱鬧吊骤,春花似錦、人聲如沸善玫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽茅郎。三九已至蜗元,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間系冗,已是汗流浹背奕扣。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留掌敬,地道東北人惯豆。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像奔害,于是被迫代替她去往敵國和親楷兽。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容