JDK1.8中HashMap的高低位索引機制

JDK1.8的HashMap在很多方面都做了優(yōu)化改進,其中擴容時引入了高低位機制,table數(shù)組中某個位置的鏈表或者紅黑樹中的節(jié)點在擴容時,不需要重新按照以前的方式計算索引位置,而只要計算hash值在舊容量最高位對應的二進制是1還是0,是1則會移動到高位索引(原索引位置+原容量),是零則在低位索引也就是原位置。

舉例如下:

hash值h二進制為
0010 1100 1111 0001 1110 1110
舊容量為length=16,二進制為
0001 0000
length-1=0000 1111
那么擴容前索引位置為
h&(length-1)=1110=14

擴容后,容量為32,對應二進制為
0010 0000
新length-1=0001 1111
hash值對新容量計算索引時,可以看出最后四位二進制是不變的,與原容量時計算一致,唯一變化的是倒數(shù)第五位的二進制值,本例中hash對應新索引不變還是14,因為hash的倒數(shù)第五位為0
如果hash為0100 0001 0010,舊容量中索引為0010=2,新容量下索引為0001 0010=18=2+16。

結論

可見在擴容后,索引位置要嘛不變,要嘛移動舊容量個位置。
而判斷的依據(jù)就是hash值在擴容后容量-1的最高位對應的值,而擴容后容量-1的最高位其實就是擴容前容量的最高位。
因此可以通過h&oldcap來判斷,=0代表對應最高位為零,不移動位置;>0代表對應最高位不為零,需要移動到高位索引。

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

相關閱讀更多精彩內容

  • 1. 原理 HashMap 底層是數(shù)組 + 鏈表 + 紅黑樹。 數(shù)組我們很熟悉,支持隨機訪問,所以在最優(yōu)情況下,即...
    Java天天閱讀 425評論 0 0
  • 什么是HashMap HashMap是一個用于存儲Key-Value鍵值對的集合,也是Java中使用頻率最高的用于...
    言淺閱讀 352評論 0 0
  • 一、HashMap概述 HashMap基于哈希表的Map接口的實現(xiàn)。此實現(xiàn)提供所有可選的映射操作,并允許使用nul...
    小陳阿飛閱讀 676評論 0 2
  • 網(wǎng)站亂碼問題我們會經(jīng)常碰到,大多見于非英文的中文字符或其他字符亂碼,而且,這類問題常常是因為編碼方式問題,主要原因...
    波段頂?shù)?/span>閱讀 3,347評論 1 9
  • 下面針對各個實現(xiàn)類的特點做一些說明: (1) HashMap:它根據(jù)鍵的hashCode值存儲數(shù)據(jù),大多數(shù)情況下可...
    晚歌歌閱讀 2,829評論 1 4

友情鏈接更多精彩內容