HashMap 中的 hash 原理

HashMap 內(nèi)部是一個散列表(數(shù)組?),存放時取 key 的 hashCode 作為 index 位,如果出現(xiàn)了 hash 沖突,則此 index 位以鏈表(length = 8 時轉(zhuǎn)化為 紅黑樹)形式存放。

  • hashCode 為 int 型,默認(rèn)為 -2147483648 到 2147483648,內(nèi)存無法接受這么長的散列表,故使用 node 的 length - 1 做 & 運(yùn)算??梢岳斫鉃榈臀谎诖a,也可以理解為截斷高位吧。

      10100101 11000100 00100101
    & 00000000 00000000 00001111
    ----------------------------
      00000000 00000000 00000101
    
    
    以下位代碼中的數(shù)組inedx 方法
    HashMap 中的取值皆是   ->  node = table[h & (length-1)] 
    
    static int indexFor(int h, int length) {
        return h & ( length - 1 );            
    }
    
  • 而僅僅使用 hashCode,會有比較高的沖突概率,所以 JDK 引入了 擾動函數(shù),簡單來說就是 int 值的32位,保留自己的高位16位,并使用高位與低位做 按位異或 ^ 來做低位16位,使用這種形式來降低 hash 沖突。


    image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容