欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

散列計(jì)算就是計(jì)算元素應(yīng)該放在數(shù)組的哪個(gè)元素里。準(zhǔn)確的說是放到哪個(gè)鏈表里面。按照J(rèn)ava的規(guī)則,如果你要想將一個(gè)對(duì)象放入HashMap中,你的對(duì)象的類必須提供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 = 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還是有爭(zhēng)議,參考這里。

認(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ù)的原因的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:

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

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

Java源碼角度分析HashMap用法

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

相關(guān)文章

  • SpringBoot整合Caffeine實(shí)現(xiàn)本地緩存的實(shí)踐分享

    SpringBoot整合Caffeine實(shí)現(xiàn)本地緩存的實(shí)踐分享

    緩存是提升系統(tǒng)性能的一個(gè)不可或缺的工具,通過緩存可以避免大部分重復(fù)的請(qǐng)求到數(shù)據(jù)庫(kù)層,減少IO鏈接次數(shù),提升整體的響應(yīng)速率,本地緩存中比較常見的比如 Caffeine 緩存,這篇文章將結(jié)合具體的 Springboot 項(xiàng)目搭配 Caffeine 實(shí)現(xiàn)本地緩存的各種使用方式
    2024-07-07
  • Spring?MVC DispatcherServlet處理請(qǐng)求過程示例詳解

    Spring?MVC DispatcherServlet處理請(qǐng)求過程示例詳解

    這篇文章主要介紹了Spring?MVC?DispatcherServlet處理請(qǐng)求過程示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • java web實(shí)現(xiàn)網(wǎng)上手機(jī)銷售系統(tǒng)

    java web實(shí)現(xiàn)網(wǎng)上手機(jī)銷售系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java web實(shí)現(xiàn)網(wǎng)上手機(jī)銷售系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • springboot2如何集成ElasticSearch6.4.3

    springboot2如何集成ElasticSearch6.4.3

    這篇文章主要介紹了springboot2如何集成ElasticSearch6.4.3問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • java實(shí)現(xiàn)ip地址與十進(jìn)制數(shù)相互轉(zhuǎn)換

    java實(shí)現(xiàn)ip地址與十進(jìn)制數(shù)相互轉(zhuǎn)換

    本文介紹在java中IP地址轉(zhuǎn)換十進(jìn)制數(shù)及把10進(jìn)制再轉(zhuǎn)換成IP地址的方法及實(shí)例參考,曬出來和大家分享一下
    2012-12-12
  • java面試常見模式問題---單例模式

    java面試常見模式問題---單例模式

    單例模式(Singleton Pattern)是 Java 中最簡(jiǎn)單的設(shè)計(jì)模式之一。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式
    2021-06-06
  • Intellij Idea 多模塊Maven工程中模塊之間無法相互引用問題

    Intellij Idea 多模塊Maven工程中模塊之間無法相互引用問題

    這篇文章主要介紹了Intellij Idea 多模塊Maven工程中模塊之間無法相互引用問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • maven混淆打包的實(shí)現(xiàn)步驟

    maven混淆打包的實(shí)現(xiàn)步驟

    本文主要介紹了maven混淆打包的實(shí)現(xiàn)步驟,包含了Maven項(xiàng)目混淆、瘦身、打包exe這幾個(gè)方面,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • Java使用默認(rèn)瀏覽器打開指定URL的方法(二種方法)

    Java使用默認(rèn)瀏覽器打開指定URL的方法(二種方法)

    Java使用默認(rèn)瀏覽器打開指定URL。
    2013-10-10
  • mapper接口注入兩種方式詳解

    mapper接口注入兩種方式詳解

    這篇文章主要介紹了mapper接口注入兩種方式詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02

最新評(píng)論