国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 定義hashcode時使用31系數的原因

定義hashcode時使用31系數的原因

2021-03-16 14:12steveguoshao Java教程

這篇文章主要介紹了定義hashcode時使用31系數的原因,具有一定借鑒價值,需要的朋友可以參考下

散列計算就是計算元素應該放在數組的哪個元素里。準確的說是放到哪個鏈表里面。按照Java的規則,如果你要想將一個對象放入HashMap中,你的對象的類必須提供hashcode方法,返回一個整數值。比如String類就有如下方法:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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;
  }

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
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;
  }

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

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

認為這個東西還是會導致較多的重復,應該用更大的數字。所以,或許將來Java的實現中會有所變化。下面這篇文章介紹了兩個結論:

1.基數要用質數

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

2.選擇31是觀測分布結果后的一個選擇,不清楚原因,但的確有利。

另外,String.hashCode內部會緩存第一次計算的值,因為這是一個final(不可變)類,也就是String對象的內容是不會變的。這能夠在多次put到HashMap的場合提高性能,不過似乎用處不多。

總結

以上就是本文關于定義hashcode時使用31系數的原因的全部內容,希望對大家有所幫助。如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

原文鏈接:http://blog.csdn.net/steveguoshao/article/details/12576849

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 亚洲一区中文字幕 | 国产亚洲精品久久久 | 老牛嫩草一区二区三区眼镜 | 成人一区二区在线观看 | 国产精品亲子伦av一区二区三区 | 日韩亚洲一区二区 | 免费在线国产 | 亚洲精品自拍 | 欧美成人一区二区三区片免费 | 国产免费天天看高清影视在线 | 午夜tv| 天天摸天天操 | 国产精品永久免费视频 | 香蕉成人啪国产精品视频综合网 | 久久一级黄 | 五月激情综合 | 伦理午夜电影免费观看 | 中文字幕人成乱码在线观看 | 国产成人网| 亚洲日本韩国在线观看 | 亚洲精品中文字幕在线观看 | 欧美日韩精品一区二区 | √天堂8在线网 | 久草在线 | 国产精品久久久久免费 | 国产精品国产成人国产三级 | 成人免费在线播放 | 日本精a在线观看 | 丝袜久久| 国产黄色在线观看 | 欧美视频免费在线 | 亚洲精品久久久久久国产精华液 | 国产精品久久久久久久久免费 | 国产在线一区二区三区 | 一区二区三区国产在线 | 求av网站| 99最新在线视频 | 亚洲精品9999 | 欧美在线观看一区 | 日韩国产在线观看 | 亚洲欧美一区二区三区情侣bbw |