日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Java HashMap實(shí)現(xiàn)原理分析(一)

瀏覽:27日期:2022-08-25 17:40:57

從本文開始,介紹一下最常用的一個集合對象HashMap,HashMap存儲的是鍵值對,本文采用的基于JDK11的源碼實(shí)現(xiàn)。 一般大家都知道HashMap是通過put操作把一組鍵值對(key和value)存儲到HashMap中,然后可以通過get(key)去獲取key對應(yīng)的value。而最重要的這兩個過程是怎么實(shí)現(xiàn)的呢?下面我們就來對put和get這兩個過程做一個分析。

HashMap基本工作原理

下面先看一段源碼:

/** * The table, initialized on first use, and resized as * necessary. When allocated, length is always a power of two. * (We also tolerate length zero in some operations to allow * bootstrapping mechanics that are currently not needed.) */transient Node<K,V>[] table;

當(dāng)用戶調(diào)用put方法的時候把key和value放入到HashMap的時候,這個數(shù)組table就是實(shí)際存儲key和value的地方。HashMap把用戶傳入的key和value封裝成一個Node<K,V>對象,把該Node<K,V>對象放入到table對應(yīng)的位置。Map執(zhí)行g(shù)et操作的時候,并沒有傳入具體的數(shù)組的索引位置信息,只是傳入了key,因此這個地方就會涉及到一個key轉(zhuǎn)索引的一個操作,然后根據(jù)索引獲取table中對應(yīng)位置的Node對象,把value值返回給用戶。由于數(shù)組的訪問時間復(fù)雜度是O(1),因此Map的get操作也可以認(rèn)為是O(1)( 這個地方先暫時理解為O(1),具體原因見后面)。

簡單來說,在執(zhí)行put方法的時候,Map會根據(jù)傳入的key獲取它hashcode值,然后根據(jù)hashcode與table大小進(jìn)行求模運(yùn)算,得到的值就是它在table數(shù)組索引位置。實(shí)際這個過程又有點(diǎn)復(fù)雜,具體下面開始分析。

HashMap 數(shù)組尋址與hash值計算

用戶通過key訪問map獲取value的時候,原理是用key的hash值來與數(shù)組的大小取模獲取數(shù)組的索引。但實(shí)際在HashMap實(shí)現(xiàn)中,對取模運(yùn)算進(jìn)行了一下優(yōu)化,采用了(n-1) & hash(key)的方法獲取數(shù)組索引,這里的n是table的大小,hash(key)表示key的哈希值,這種方法可以得到與取模運(yùn)算一樣的效果,但是速度要比取模運(yùn)算快。

下面看一下,hash(key)的實(shí)現(xiàn)邏輯

static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);}

從上面的源碼看:

調(diào)用key的hashCode()方法獲取hashCode值h 把h進(jìn)行無符號右移16位 把h與h右移后的值進(jìn)行異或操作最后得到key的hash值。

這里大家比較好奇,為什么會進(jìn)行這種復(fù)雜操作,他的用意是什么?下面來給大家說一下這個過程。

假設(shè) table的大小是16,key1和Key2調(diào)用hashCode方法獲取的值的二進(jìn)制形式分別是:

1111 1111 1111 1101 0000 0000 0000 0001 # key11111 1111 1111 1111 0000 0000 0000 0001 # key2

首先我們直接使用key1和key2的hashCode獲取的值去計算在的table的索引值。具體過程是:

# key1在table中索引的計算過程與結(jié)果1111 1111 1111 1101 0000 0000 0000 0001 0000 0000 0000 0000 0000 0000 0000 1111 & #n-1的二進(jìn)制---------------------------------------0000 0000 0000 0000 0000 0000 0000 0001 # 得到的table索引是1# key2在table中索引的計算過程與結(jié)果1111 1111 1111 1111 0000 0000 0000 0001 0000 0000 0000 0000 0000 0000 0000 1111 & #n-1的二進(jìn)制---------------------------------------0000 0000 0000 0000 0000 0000 0000 0001 #得到的table索引是1

根據(jù)上面計算結(jié)果可知,雖然key1和key2值不同,但是最后得到的table的索引都是1,這樣就會出現(xiàn)了沖突。主要原因是在與n-1進(jìn)行&操作的時候,通常n的值比較小,因此高16位都是0,這樣0和任何數(shù)&結(jié)果都是0。通常key的hashCode取值很不固定。從最高位到最低位都會出現(xiàn)1的可能。比如key1和key2,他們的區(qū)別恰恰是出現(xiàn)在自己的hashCode的高16位,因此key1和key2與n-1進(jìn)行&操作的結(jié)果是一樣的。如果key1和key2經(jīng)過hash()方法處理后呢,來看看結(jié)果:

# key1在table中索引的計算過程與結(jié)果 1111 1111 1111 1101 0000 0000 0000 0001 #key1本身^ 0000 0000 0000 0000 1111 1111 1111 1101 #key1右移16的值----------------------------------------------- 1111 1111 1111 1111 1111 1111 1111 1100 # hash(key1)計算后的值& 0000 0000 0000 0000 0000 0000 0000 1111 #n-1的二進(jìn)制----------------------------------------------- 0000 0000 0000 0000 0000 0000 0000 1100 #得到的table索引是12# key2在table中索引的計算過程與結(jié)果 1111 1111 1111 1111 0000 0000 0000 0001 #key2本身^ 0000 0000 0000 0000 1111 1111 1111 1111 #key2右移16的值----------------------------------------------- 1111 1111 1111 1111 1111 1111 1111 1110 #hash(key1)計算后的值& 0000 0000 0000 0000 0000 0000 0000 1111 #n-1的二進(jìn)制----------------------------------------------- 0000 0000 0000 0000 0000 0000 0000 1110 #得到的table索引是14

這樣key1和key2不會出現(xiàn)位置沖突。當(dāng)key和自己的高16位進(jìn)行異或操作的后的值的低16位中同時保留了原始key低16位和高16位的特征。因此key1和key2再和n-1進(jìn)行&運(yùn)算時,減少了出現(xiàn)相同值的可能性。明白了這些內(nèi)容內(nèi)容,下一篇文章開始結(jié)束HashMap的put和get方法的實(shí)現(xiàn)原理。

以上就是Java HashMap實(shí)現(xiàn)原理分析(一)的詳細(xì)內(nèi)容,更多關(guān)于Java HashMap原理的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲三级欧美| 欧美高清一区| 99精品在线观看| 精品亚洲二区| 国产成人精品免费视| av资源中文在线天堂| 国产网站在线| 欧美日韩国产免费观看视频| 精品一区亚洲| 深夜日韩欧美| 一区二区高清| 国产精品探花在线观看| 国产一区调教| 国产激情在线播放| 精品一区91| 国产精品4hu.www| 国产极品嫩模在线观看91精品| 捆绑调教美女网站视频一区| 久久免费精品| 在线观看免费一区二区| 国产欧美在线观看免费| 久久久久国产精品一区二区| 欧美精品一卡| 久久只有精品| 日韩欧美视频专区| 成人在线视频免费看| 欧美美女一区| 欧美日韩亚洲国产精品| 久久天堂成人| 麻豆精品新av中文字幕| 91精品国产福利在线观看麻豆| 免费毛片在线不卡| 青草国产精品久久久久久| 精品国产乱码久久久久久樱花| 久久精品导航| 日韩高清在线一区| 日韩欧美国产精品综合嫩v| 日韩免费精品| 免费一二一二在线视频| 亚洲精选91| 国产一区视频在线观看免费| 久久精品国产免费| 四虎精品永久免费| 国产va在线视频| 欧美在线看片| 青青青免费在线视频| 日韩国产精品久久久久久亚洲| 另类国产ts人妖高潮视频| 精品一区二区三区视频在线播放 | 欧美三级精品| 国产日韩欧美一区二区三区| 最新国产拍偷乱拍精品| 国产精品sm| 国产精品www.| 日本午夜精品| 久久福利影视| 亚洲黄色在线| 国产综合婷婷| 国精品产品一区| 国产日韩欧美一区二区三区 | 日韩免费福利视频| 国产91在线播放精品| 久久精品国产99国产| 丁香婷婷久久| 视频在线不卡免费观看| 日韩av一级片| 久久久免费人体| 97久久亚洲| 婷婷激情图片久久| 99亚洲视频| 免费看欧美美女黄的网站| 国产亚洲综合精品| 国产精品毛片在线看| 久久亚洲一区| 日本不卡在线视频| 国产精品国产三级在线观看| 国产精品99视频| a日韩av网址| 黑丝一区二区| 日本欧美在线看| 欧美亚洲一区二区三区| 国产精品传媒麻豆hd| 久久影院资源站| 国产精品视频一区视频二区| 国产精品久久久久久久免费软件| 韩日一区二区| 欧美sss在线视频| 天使萌一区二区三区免费观看| 中文字幕成人| 精品伊人久久久| 久久久久国产精品一区三寸| 视频一区欧美精品| 精品久久国产一区| 一区二区视频欧美| 精品一区二区男人吃奶 | 欧美日韩黑人| 1024精品久久久久久久久| 国产免费播放一区二区| 国产成人精品999在线观看| 久久美女性网| 国产精品2023| 亚洲欧洲另类| 久久精品亚洲| 久久激情五月激情| 亚洲欧美成人综合| 欧美1区2区3| 国产亚洲网站| 亚洲深夜视频| 精品一区二区三区中文字幕在线| 久久精品影视| 精品中文字幕一区二区三区 | 99热精品在线| 久久蜜桃资源一区二区老牛| 国产精品欧美三级在线观看 | 欧美在线综合| 亚洲精品88| 日韩欧美三级| 99久久精品网站| 成人日韩av| 国产麻豆一区| 日韩一区二区三区高清在线观看| 亚洲女同一区| 国产成人在线中文字幕| 欧美精品aa| 久久免费福利| 国产成人在线中文字幕| 国产日韩中文在线中文字幕 | 四虎在线精品| 亚洲永久字幕| 欧美在线影院| 成人欧美一区二区三区的电影| 日韩精品免费观看视频| 亚洲激情久久| 日韩一区二区久久| 91精品福利| 宅男在线一区| 国产一区观看| 亚洲欧洲另类| 婷婷综合六月| 国产一区不卡| 久久久91麻豆精品国产一区| 日日夜夜免费精品视频| 另类激情亚洲| 丝袜a∨在线一区二区三区不卡| 日韩欧美一区免费| 国产精品美女久久久久久不卡| 亚洲女人av| 久久福利毛片| 亚洲一级大片| 日本不卡视频在线| 日韩三级一区| 国产拍在线视频| 精品视频在线观看网站| 国际精品欧美精品| 伊人久久大香伊蕉在人线观看热v| 国产精品magnet| 视频福利一区| 国产亚洲一卡2卡3卡4卡新区| 手机在线电影一区| 美国欧美日韩国产在线播放| 久久wwww| 极品裸体白嫩激情啪啪国产精品| 91精品一区| 日韩av有码| 日本欧美在线看| 国产99久久久国产精品成人免费| 日韩美女精品| 亚洲色诱最新| 中文字幕在线官网| 日韩不卡一二三区| 好吊一区二区三区| 久久久久久免费视频| 久久精品国产精品亚洲毛片| 欧美日韩一视频区二区| 国产视频一区三区| 国产精品99免费看| 国产欧美日韩在线一区二区| 麻豆亚洲精品| 久久精品91| 久久蜜桃精品| 欧美日韩中文字幕一区二区三区 | 欧美香蕉视频| 色老板在线视频一区二区| 91久久在线| 久久av网址| 九九在线精品| 国产区精品区| 午夜久久tv| 国产黄色一区| 麻豆精品蜜桃| 88久久精品| 久久久成人网| 日本成人手机在线| 久久久9色精品国产一区二区三区| 伊人久久一区| av不卡免费看| 在线日韩电影| 亚洲精品va| 亚洲黄色免费看| 久久99精品久久久久久园产越南|