HashMap知識(shí)點(diǎn)

1:hashmap簡介(如下凿跳,數(shù)組-鏈表形式)

HashMap的存儲(chǔ)結(jié)構(gòu)

權(quán)威hashmap类茂,讀透一篇即可KO面試官指南(升級(jí)版)

圖中,紫色部分即代表哈希表晋控,也稱為哈希數(shù)組(默認(rèn)數(shù)組大小是16峡谊,每對(duì)key-value鍵值對(duì)其實(shí)是存在map的內(nèi)部類entry里的)茫虽,數(shù)組的每個(gè)元素都是一個(gè)單鏈表的頭節(jié)點(diǎn),跟著的綠色鏈表是用來解決沖突的既们,如果不同的key映射到了數(shù)組的同一位置處濒析,就將其放入單鏈表中

2:hashmap原理(即put和get原理)

2.1 put原理

1.根據(jù)key獲取對(duì)應(yīng)hash值:int hash = hash(key.hash.hashcode())

2.根據(jù)hash值和數(shù)組長度確定對(duì)應(yīng)數(shù)組引int i = indexFor(hash, table.length); 簡單理解就是i = hash值%模以 數(shù)組長度(其實(shí)是按位與運(yùn)算)啥纸。如果不同的key都映射到了數(shù)組的同一位置處号杏,就將其放入單鏈表中。且新來的是放在頭節(jié)點(diǎn)斯棒。

2.2 get原理

1.通過hash獲得對(duì)應(yīng)數(shù)組位置盾致,遍歷該數(shù)組所在鏈表(key.equals())

3:hashcode相同,沖突怎么辦荣暮?

“頭插法”绰上,放到對(duì)應(yīng)的鏈表的頭部。

3.1:為什么是頭插法(其設(shè)計(jì)原理是什么)渠驼?

因?yàn)镠ashMap的發(fā)明者認(rèn)為,后插入的Entry被查找的可能性更大(因?yàn)間et查詢的時(shí)候會(huì)遍歷整個(gè)鏈表)鉴腻。

4.hashmap的默認(rèn)數(shù)組長度是多少迷扇?

默認(rèn)為16

4.1 為什么?

之所以選擇16爽哎,是為了服務(wù)于從key映射到index的hash算法(看下面)蜓席。

5:hashmap達(dá)到默認(rèn)負(fù)載因子(0.75)怎么辦?

自動(dòng)雙倍擴(kuò)容课锌,擴(kuò)容后重新計(jì)算每個(gè)鍵值對(duì)位置厨内。且長度必須為16或者2的冪次

5.1為啥要16或者2的冪次祈秕?

  • 若不是16或者2的冪次,位運(yùn)算的結(jié)果不夠均勻分布雏胃,顯然不符合Hash算法均勻分布的原則请毛。
  • 反觀長度16或者其他2的冪,Length-1的值是所有二進(jìn)制位全為1瞭亮,這種情況下方仿,index的結(jié)果等同于HashCode后幾位的值。只要輸入的HashCode本身分布均勻统翩,Hash算法的結(jié)果就是均勻的仙蚜。

6:hashmap是線程安全的嗎?

不是厂汗。

6.2 為什么委粉?

因?yàn)闆]加鎖

6.3 那在并發(fā)時(shí)會(huì)導(dǎo)致什么問題?

hashmap在接近臨界點(diǎn)時(shí)娶桦,若此時(shí)兩個(gè)或者多個(gè)線程進(jìn)行put操作贾节,都會(huì)進(jìn)行resize(擴(kuò)容)和ReHash(為key重新計(jì)算所在位置),而ReHash在并發(fā)的情況下可能會(huì)形成鏈表環(huán)趟紊。

6.4 如何判斷有環(huán)形表氮双?

最優(yōu):首先創(chuàng)建兩個(gè)指針A和B(在java里就是兩個(gè)對(duì)象引用),同時(shí)指向這個(gè)鏈表的頭節(jié)點(diǎn)霎匈。然后開始一個(gè)大循環(huán)戴差,在循環(huán)體中,讓指針A每次向下移動(dòng)一個(gè)節(jié)點(diǎn)铛嘱,讓指針B每次向下移動(dòng)兩個(gè)節(jié)點(diǎn)暖释,然后比較兩個(gè)指針指向的節(jié)點(diǎn)是否相同。如果相同墨吓,則判斷出鏈表有環(huán)球匕,如果不同,則繼續(xù)下一次循環(huán)帖烘。

理解:此方法也可以用一個(gè)更生動(dòng)的例子來形容:在一個(gè)環(huán)形跑道上亮曹,兩個(gè)運(yùn)動(dòng)員在同一地點(diǎn)起跑,一個(gè)運(yùn)動(dòng)員速度快秘症,一個(gè)運(yùn)動(dòng)員速度慢照卦。當(dāng)兩人跑了一段時(shí)間,速度快的運(yùn)動(dòng)員必然會(huì)從速度慢的運(yùn)動(dòng)員身后再次追上并超過乡摹,原因很簡單役耕,因?yàn)榕艿朗黔h(huán)形的。

權(quán)威hashmap聪廉,讀透一篇即可KO面試官指南(升級(jí)版)

7: hashmap 和 hashtable 區(qū)別瞬痘?

線程: 不安全 安全(synchronized修飾)

效率: 更高 略低

數(shù)組默認(rèn)值: 16 11

null值: key-value都允許 不允許(拋異常)

其中key為null的map對(duì)象就在索引為0的位置上

8:那hashmap不安全故慈,hashtable性能又低,怎么辦框全?

用concurrenthashmap察绷,即保證安全,性能又可以保障

8.1 那concurrenthashmap究竟是什么竣况?

整個(gè)ConcurrentHashMap的結(jié)構(gòu)如下:

權(quán)威hashmap克婶,讀透一篇即可KO面試官指南(升級(jí)版)

理解:hashmap是有entry數(shù)組組成,而concurrenthashmap則是Segment數(shù)組丹泉。那Segment是什么呢情萤?Segment本身就相當(dāng)于一個(gè)HashMap對(duì)象。同HashMap一樣摹恨,Segment包含一個(gè)HashEntry數(shù)組筋岛,數(shù)組中的每一個(gè)HashEntry既是一個(gè)鍵值對(duì),也是一個(gè)鏈表的頭節(jié)點(diǎn)晒哄。

單一的Segment結(jié)構(gòu)如下(是不是看著就是hashmap):

權(quán)威hashmap睁宰,讀透一篇即可KO面試官指南(升級(jí)版)

像這樣的Segment對(duì)象,在ConcurrentHashMap集合中有多少個(gè)呢寝凌?有2的N次方個(gè)柒傻,共同保存在一個(gè)名為segments的數(shù)組當(dāng)中。

可以說较木,ConcurrentHashMap是一個(gè)二級(jí)哈希表红符。在一個(gè)總的哈希表下面,有若干個(gè)子哈希表伐债。(這樣類比理解hashmap)

8.2:那他的put和get方法呢(對(duì)比hashmap的普通和get方法)预侯?

Put方法:

  • 1.為輸入的Key做Hash運(yùn)算,得到hash值峰锁。
  • 2.通過hash值萎馅,定位到對(duì)應(yīng)的Segment對(duì)象
  • 3.獲取可重入鎖
  • 4.再次通過hash值,定位到Segment當(dāng)中數(shù)組的具體位置虹蒋。
  • 5.插入或覆蓋HashEntry對(duì)象糜芳。
  • 6.釋放鎖。


    image.png

Get方法:

  • 1.為輸入的Key做Hash運(yùn)算魄衅,得到hash值峭竣。
  • 2.通過hash值,定位到對(duì)應(yīng)的Segment對(duì)象
  • 3.再次通過hash值徐绑,定位到Segment當(dāng)中數(shù)組的具體位置。

由此可見莫辨,和hashmap相比傲茄,ConcurrentHashMap在讀寫的時(shí)候都需要進(jìn)行二次定位毅访。先定位到Segment,再定位到Segment內(nèi)的具體數(shù)組下標(biāo)盘榨。

9: hashmap 和 concurrenthashmap區(qū)別喻粹?

線程: 不安全 安全

10:為啥concurrenthashmap和hashtable都是線程安全,但是前者性能更高

因?yàn)榍罢呤怯玫姆侄捂i草巡,根據(jù)hash值鎖住對(duì)應(yīng)鏈表守呜,當(dāng)hash值不同時(shí),使其能實(shí)現(xiàn)并行插入山憨,效率更高查乒,而hashtable會(huì)鎖住整個(gè)map

當(dāng)需要put元素的時(shí)候,并不是對(duì)整個(gè)hashmap進(jìn)行加鎖郁竟,而是先通過hashcode來知道他要放在那一個(gè)分段中玛迄,然后對(duì)這個(gè)分段進(jìn)行加鎖,所以當(dāng)多線程put的時(shí)候棚亩,只要不是放在同一個(gè)分段中蓖议,就實(shí)現(xiàn)了真正的并行的插入。

但是讥蟆,在統(tǒng)計(jì)size的時(shí)候勒虾,就是獲取hashmap全局信息的時(shí)候,就需要獲取所有的分段鎖才能統(tǒng)計(jì)瘸彤。

分段鎖的設(shè)計(jì)目的是細(xì)化鎖的粒度修然,當(dāng)操作不需要更新整個(gè)數(shù)組的時(shí)候,就僅僅針對(duì)數(shù)組中的一部分行加鎖操作钧栖。

11.java7的hashmap和java8的hashmap的區(qū)別(1.8做了哪些優(yōu)化)低零?

為了加快查詢效率(因?yàn)間et()需要遍歷整張鏈表),java8的hashmap引入了紅黑樹結(jié)構(gòu)拯杠,當(dāng)某一鏈表的元素>8時(shí)掏婶,該鏈表就會(huì)轉(zhuǎn)成紅黑樹結(jié)構(gòu),查詢效率更高

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末潭陪,一起剝皮案震驚了整個(gè)濱河市雄妥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌依溯,老刑警劉巖老厌,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異黎炉,居然都是意外死亡枝秤,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門慷嗜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來淀弹,“玉大人丹壕,你說我怎么就攤上這事∞崩#” “怎么了菌赖?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長沐序。 經(jīng)常有香客問我琉用,道長,這世上最難降的妖魔是什么策幼? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任邑时,我火速辦了婚禮,結(jié)果婚禮上垄惧,老公的妹妹穿的比我還像新娘刁愿。我一直安慰自己,他們只是感情好到逊,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布铣口。 她就那樣靜靜地躺著,像睡著了一般觉壶。 火紅的嫁衣襯著肌膚如雪脑题。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天铜靶,我揣著相機(jī)與錄音叔遂,去河邊找鬼。 笑死争剿,一個(gè)胖子當(dāng)著我的面吹牛已艰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蚕苇,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼哩掺,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了涩笤?” 一聲冷哼從身側(cè)響起嚼吞,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蹬碧,沒想到半個(gè)月后舱禽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡恩沽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年誊稚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡里伯,死狀恐怖绽昏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情俏脊,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布肤晓,位于F島的核電站爷贫,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏补憾。R本人自食惡果不足惜漫萄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盈匾。 院中可真熱鬧腾务,春花似錦、人聲如沸削饵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽窿撬。三九已至启昧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間劈伴,已是汗流浹背密末。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留跛璧,地道東北人严里。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像追城,于是被迫代替她去往敵國和親刹碾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載:https://www.cnblogs.com/xdouby/p/6026618.html 在JDK 1.4...
    境里婆娑閱讀 2,556評(píng)論 0 4
  • 他在這世上漓柑, 他有一個(gè)名字
    觸角_閱讀 206評(píng)論 0 0
  • 自加入林曉燕老師的“不讀財(cái)報(bào)就出局”以來教硫,這是我跟的第三期課程;第一次處于懵懵懂懂的狀態(tài)辆布,第二次逐漸的對(duì)五大關(guān)鍵數(shù)...
    HHzhao閱讀 418評(píng)論 0 0
  • 吻一個(gè)遙遠(yuǎn)的夢(mèng)锋玲, 觀一處眼前的景景用, 走一段夢(mèng)想的路, 思一陣未來的風(fēng), 盼一位知心的人伞插。 你笑我割粮, 還在這兒傻傻等...
    小劇在成長閱讀 322評(píng)論 2 1