最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2018年01月08日 15:49:43   作者:steveguoshao  
這篇文章主要介紹了定義hashcode時使用31系數(shù)的原因,具有一定借鑒價值,需要的朋友可以參考下

散列計算就是計算元素應該放在數(shù)組的哪個元素里。準確的說是放到哪個鏈表里面。按照Java的規(guī)則,如果你要想將一個對象放入HashMap中,你的對象的類必須提供hashcode方法,返回一個整數(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 = 31*h + val[off++]; 
      } 
      hash = h; 
    } 
    return h; 
  } 

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

a*31^4+b*31^3+c*31^2+d*31^1+e*31^0.注意,這里的a,b,c,d或者e指的是它們的ASCII值。很有趣的循環(huán),居然可以用來算N進制。這個循環(huá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作為進制基數(shù),數(shù)組a模擬要計算的進制的數(shù)字,只是注意表面順序需要一致。比如 01 二進制串,在數(shù)組中要按照{(diào)0,1}排列。上面的輸出結果是1,符合01的真實值。

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

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

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

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

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

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

總結

以上就是本文關于定義hashcode時使用31系數(shù)的原因的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:

重寫hashCode()和equals()方法詳細介紹

詳解hashCode()和equals()的本質(zhì)區(qū)別和聯(lián)系

Java源碼角度分析HashMap用法

如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

相關文章

  • Java8新增的重復注解功能示例

    Java8新增的重復注解功能示例

    這篇文章主要介紹了Java8新增的重復注解功能,結合實例形式分析了java8重復注解的功能、定義、使用方法及相關操作注意事項,需要的朋友可以參考下
    2019-10-10
  • Spring中的@PathVariable注解詳細解析

    Spring中的@PathVariable注解詳細解析

    這篇文章主要介紹了Spring中的@PathVariable注解詳細解析,@PathVariable 是 Spring 框架中的一個注解,用于將 URL 中的變量綁定到方法的參數(shù)上,它通常用于處理 RESTful 風格的請求,從 URL 中提取參數(shù)值,并將其傳遞給方法進行處理,需要的朋友可以參考下
    2024-01-01
  • java比較兩個list是否相同equals的代碼詳解

    java比較兩個list是否相同equals的代碼詳解

    在本篇文章里小編給大家分享的是關于java比較兩個list是否相同equals的代碼詳解,有需要的朋友們可以參考學習下。
    2020-02-02
  • Spring Properties的使用和配置方法

    Spring Properties的使用和配置方法

    這篇文章主要介紹了Spring Properties的使用和配置方法,本文不是原理分析、源碼分析文章,只是希望可以幫助讀者更好地理解和使用 Spring Properties,有興趣的可以了解一下
    2018-01-01
  • Java中Arrays.asList()方法詳解及實例

    Java中Arrays.asList()方法詳解及實例

    這篇文章主要介紹了Java中Arrays.asList()方法將數(shù)組作為列表時的一些差異的相關資料,需要的朋友可以參考下
    2017-06-06
  • java自定義任務類定時執(zhí)行任務示例 callable和future接口使用方法

    java自定義任務類定時執(zhí)行任務示例 callable和future接口使用方法

    Callable是類似于Runnable的接口,實現(xiàn)Callable接口的類和實現(xiàn)Runnable的類都是可被其它線程執(zhí)行的任務
    2014-01-01
  • 介紹Java的大數(shù)類(BigDecimal)和八種舍入模式

    介紹Java的大數(shù)類(BigDecimal)和八種舍入模式

    在實際應用中,需要對更大或者更小的數(shù)進行運算和處理。Java在java.math包中提供的API類BigDecimal,用來對超過16位有效位的數(shù)進行精確的運算。本文將介紹Java中的大數(shù)類BigDecimal及其八種舍入模式,有需要的可以參考借鑒。
    2016-08-08
  • Maven分步詳解多環(huán)境配置與應用流程

    Maven分步詳解多環(huán)境配置與應用流程

    這篇文章主要介紹了Maven進階多環(huán)境配置與應用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • java跳出循環(huán)的三種方式總結(break語句、continue語句和return語句)

    java跳出循環(huán)的三種方式總結(break語句、continue語句和return語句)

    在實際編程中,有時需要在條件語句匹配的時候跳出循環(huán),下面這篇文章主要給大家介紹了關于java跳出循環(huán)的三種方式,其中包括break語句、continue語句和return語句的相關資料,需要的朋友可以參考下
    2023-03-03
  • string boot 與 自定義interceptor的實例講解

    string boot 與 自定義interceptor的實例講解

    下面小編就為大家分享一篇string boot 與 自定義interceptor的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12

最新評論

无棣县| 临高县| 搜索| 崇礼县| 滦平县| 临沧市| 怀集县| 界首市| 谢通门县| 彭阳县| 景泰县| 秭归县| 甘泉县| 民丰县| 宝坻区| 安庆市| 稻城县| 开阳县| 南乐县| 象州县| 望城县| 广安市| 鸡泽县| 黄平县| 建湖县| 垣曲县| 和龙市| 宣武区| 天门市| 锡林郭勒盟| 望奎县| 卢龙县| 松溪县| 山阴县| 三台县| 望奎县| 东方市| 宣武区| 临猗县| 襄樊市| 大新县|