国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > Java > 正文

定義hashcode時(shí)使用31系數(shù)的原因

2024-07-13 10:16:11
字體:
供稿:網(wǎng)友

散列計(jì)算就是計(jì)算元素應(yīng)該放在數(shù)組的哪個(gè)元素里。準(zhǔn)確的說是放到哪個(gè)鏈表里面。按照J(rèn)ava的規(guī)則,如果你要想將一個(gè)對(duì)象放入HashMap中,你的對(duì)象的類必須提供javascript/38877.html">hashcode方法,返回一個(gè)整數(shù)值。比如String類就有如下方法:

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 = 3196.html">31*h + val[off++];       }       hash = h;     }     return h;   } 

注意上面的for循環(huán),有點(diǎn)搞吧?我來舉個(gè)例子,讓你很容易明白它在搞什么名堂。比如有一個(gè)字符串“abcde”,采用31進(jìn)制的計(jì)算方法來計(jì)算這個(gè)字符串的總和,你會(huì)寫出下面的計(jì)算式子:

a*31^4+b*31^3+c*31^2+d*31^1+e*31^0.注意,這里的a,b,c,d或者e指的是它們的ASCII值。很有趣的循環(huán),居然可以用來算N進(jìn)制。這個(gè)循環(huán)可以抽出來單獨(dú)作為計(jì)算進(jìn)制的好工具:

public static void main(String[] args) {     int[] a={1,0};     System.out.println(calculate(2,a));   }    private static int calculate(int radix,int[] a){     int sum = 0;     for(int i=0;i<a.length;++i){       sum = sum*radix+a[i];     }     return sum;   } 

靜態(tài)方法caculate接受radix作為進(jìn)制基數(shù),數(shù)組a模擬要計(jì)算的進(jìn)制的數(shù)字,只是注意表面順序需要一致。比如 01 二進(jìn)制串,在數(shù)組中要按照{(diào)0,1}排列。上面的輸出結(jié)果是1,符合01的真實(shí)值。

那么為什么選用31作為基數(shù)呢?先要明白為什么需要HashCode.每個(gè)對(duì)象根據(jù)值計(jì)算HashCode,這個(gè)code大小雖然不奢求必須唯一(因?yàn)檫@樣通常計(jì)算會(huì)非常慢),但是要盡可能的不要重復(fù),因此基數(shù)要盡量的大。另外,31*N可以被編譯器優(yōu)化為
左移5位后減1,有較高的性能。其實(shí)選用31還是有爭議,參考這里。

認(rèn)為這個(gè)東西還是會(huì)導(dǎo)致較多的重復(fù),應(yīng)該用更大的數(shù)字。所以,或許將來Java的實(shí)現(xiàn)中會(huì)有所變化。下面這篇文章介紹了兩個(gè)結(jié)論:

1.基數(shù)要用質(zhì)數(shù)

質(zhì)數(shù)的特性(只有1和自己是因子)能夠使得它和其他數(shù)相乘后得到的結(jié)果比其他方式更容易產(chǎn)成唯一性,也就是hash code值的沖突概率最小。

2.選擇31是觀測(cè)分布結(jié)果后的一個(gè)選擇,不清楚原因,但的確有利。

另外,String.hashCode內(nèi)部會(huì)緩存第一次計(jì)算的值,因?yàn)檫@是一個(gè)final(不可變)類,也就是String對(duì)象的內(nèi)容是不會(huì)變的。這能夠在多次put到HashMap的場(chǎng)合提高性能,不過似乎用處不多。

總結(jié)

以上就是本文關(guān)于定義hashcode時(shí)使用31系數(shù)的原因的全部內(nèi)容,希望對(duì)大家有所幫助。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到JAVA教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 黔东| 资源县| 青阳县| 和静县| 宜兴市| 隆安县| 广州市| 太康县| 巴彦县| 新建县| 高台县| 五台县| 江山市| 开化县| 永平县| 普兰县| 宾阳县| 冀州市| 色达县| 富阳市| 乌恰县| 峡江县| 淳化县| 绥芬河市| 乳源| 革吉县| 太白县| 克什克腾旗| 巴青县| 乌鲁木齐市| 吴江市| 七台河市| 海伦市| 郴州市| 宜都市| 赤峰市| 新郑市| 凌云县| 桐梓县| 临沧市| 咸阳市|