衡水wap網(wǎng)站建設(shè)會(huì)計(jì)培訓(xùn)班的費(fèi)用是多少
我在網(wǎng)上看了很多文章 ,各種長(zhǎng)篇大論 ,原理細(xì)節(jié)、實(shí)在看不下去了,所以著重講一下,HashMap 面試會(huì)問(wèn)到的點(diǎn)
說(shuō)人話, 你們公司的集合 不會(huì)自研吧, 假如 你們叫 錘子科技 ,那老板也不會(huì)要求你去寫(xiě)一個(gè) CuiMap 去強(qiáng)制要求所有開(kāi)發(fā)人員
所以 學(xué)習(xí) HashMap 只需要 學(xué)習(xí)思想 , 比如下載 JDK 源碼 編譯 、打斷點(diǎn)調(diào)試 參考寫(xiě)法 ,嘗試的去 封裝 、優(yōu)化細(xì)節(jié)
而不是畫(huà)一堆圖,更多的是實(shí)操,面試的話 ,把下面 的 HashMap 幾個(gè)重點(diǎn)背下來(lái)即可 ,面試官想要了解的是 你有沒(méi)有過(guò) 源碼的 閱讀習(xí)慣 ,如果有的話 這樣 也就說(shuō)明 你是個(gè)靜下心來(lái)鉆研的人
這樣今后項(xiàng)目中,你也能有一份光、 發(fā)一份熱!
- JDK 源碼閱讀環(huán)境搭建
- HashMap 的存儲(chǔ)機(jī)制
a. 在 Java 1.8 中,如果鏈表的長(zhǎng)度超過(guò)了 8且數(shù)組長(zhǎng)度最小要達(dá)到64 ,那么鏈表將轉(zhuǎn)化為紅黑樹(shù);鏈表長(zhǎng)度低于6,就把紅黑樹(shù)轉(zhuǎn)回鏈表; - Java 1.8 中 HashMap 的不同
a. 在 Java 1.8 中,如果鏈表的長(zhǎng)度超過(guò)了 8 ,那么鏈表將轉(zhuǎn)化為紅黑樹(shù);鏈表長(zhǎng)度低于6,就把紅黑樹(shù)轉(zhuǎn)回鏈表;
b. 發(fā)生 hash 碰撞時(shí),Java 1.7 會(huì)在鏈表頭部插入,而 Java 1.8 會(huì)在鏈表尾部插入;
c. 在 Java 1.8 中,Entry 被 Node 代替(換了一個(gè)馬甲)。 - put過(guò)程
a. 對(duì)Key求Hash值,然后再計(jì)算下標(biāo)
b. 如果沒(méi)有碰撞,直接放入桶中(碰撞的意思是計(jì)算得到的Hash值相同,需要放到同一個(gè)bucket中)
c. 如果碰撞了,以鏈表的方式鏈接到后面
d. 如果鏈表長(zhǎng)度超過(guò)閥值( TREEIFY THRESHOLD==8),就把鏈表轉(zhuǎn)成紅黑樹(shù),鏈表長(zhǎng)度低于6,就把紅黑樹(shù)轉(zhuǎn)回鏈表
e. 如果節(jié)點(diǎn)已經(jīng)存在就替換舊值
f. 如果桶滿了(容量16*加載因子0.75),就需要 resize(擴(kuò)容2倍后重排) - get過(guò)程
a. 當(dāng)我們調(diào)用get()方法,HashMap會(huì)使用鍵對(duì)象的hashcode找到bucket位置
b. 找到bucket位置之后,會(huì)調(diào)用keys.equals()方法去找到鏈表中正確的節(jié)點(diǎn)
c. 最終找到要找的值對(duì)象
HashMap 官網(wǎng)參考 :
- https://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html