2021-03-23 hashMap 源碼學(xué)習(xí)

hashMap 數(shù)據(jù)結(jié)構(gòu):

jdk1.7 數(shù)組+鏈表
jdk1.8 數(shù)組+鏈表+紅黑樹(shù)

hashMap 原理:

1.7 說(shuō)明:

HashMap map = new HashMap();
實(shí)例化以后岩臣,底層創(chuàng)建了長(zhǎng)度 為16,類型為Entry的數(shù)組 table.

map.put(key1,value1);
首先架谎,調(diào)用key1所在類的hashCode()計(jì)算key1哈希值炸宵,哈希值經(jīng)過(guò)算法計(jì)算,得到上面Entry數(shù)組中的存放位置谷扣,

情況一:

如果此位置上的數(shù)據(jù)為空土全,插入key1,value1抑钟,添加成功涯曲。

情況二:

如果此位置不為空(意味此位置存在一個(gè)或多個(gè)數(shù)據(jù)(以鏈表形勢(shì)存在))比較key1和已經(jīng)存在一個(gè)或多個(gè)數(shù)據(jù)的哈希值。如果key1的哈希值和已經(jīng)存在數(shù)據(jù)的哈希值都不相同在塔,插入key1幻件,value1,添加成功蛔溃。

情況三:

如果key1的哈希值和已經(jīng)存在的某一個(gè)數(shù)據(jù)(key2-value2)的哈希值相同绰沥,繼續(xù)比較:調(diào)用key1所在類的equals(key2)方法,比較:如果equals()返回false:此時(shí)key1-value1添加成功贺待。
如果equals()返回true:使用value1替換value2徽曲。相當(dāng)于把原來(lái)的值替換為新值。

補(bǔ)充:關(guān)于情況2和情況3:此時(shí)key1-value1和原來(lái)的數(shù)據(jù)以鏈表的方式存儲(chǔ)麸塞。
在不斷的添加過(guò)程中秃臣,會(huì)涉及到擴(kuò)容問(wèn)題,當(dāng)超出臨界值(且要存放的位置非空)時(shí),擴(kuò)容奥此。默認(rèn)的擴(kuò)容方式:擴(kuò)容為原來(lái)容量的2倍弧哎,并將原有的數(shù)據(jù)復(fù)制過(guò)來(lái)。

1.8 相較于jdk7在底層實(shí)現(xiàn)方面的不同:

  1. new HashMap():底層沒(méi)有創(chuàng)建一個(gè)長(zhǎng)度為16的數(shù)組
  2. jdk 8底層的數(shù)組是:Node[],而非Entry[]
  3. 首次調(diào)用put()方法時(shí)稚虎,底層創(chuàng)建長(zhǎng)度為16的數(shù)組
  4. jdk7底層結(jié)構(gòu)只有:數(shù)組+鏈表撤嫩。jdk8中底層結(jié)構(gòu):數(shù)組+鏈表+紅黑樹(shù)。當(dāng)數(shù)組的某一個(gè)索引位置上的元素以鏈表形式存在的數(shù)據(jù)個(gè)數(shù) > 8 且當(dāng)前數(shù)組的長(zhǎng)度 > 64時(shí)此時(shí)此索引位置上的所有數(shù)據(jù)改為使用紅黑樹(shù)存儲(chǔ)蠢终。

更加詳細(xì)資料https://gitee.com/SnailClimb/JavaGuide/blob/master/docs/java/collection/HashMap(JDK1.8)%E6%BA%90%E7%A0%81+%E5%BA%95%E5%B1%82%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E5%88%86%E6%9E%90.md#%E6%9E%84%E9%80%A0%E6%96%B9%E6%B3%95

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末序攘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子寻拂,更是在濱河造成了極大的恐慌程奠,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兜喻,死亡現(xiàn)場(chǎng)離奇詭異梦染,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)朴皆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)泛粹,“玉大人遂铡,你說(shuō)我怎么就攤上這事【фⅲ” “怎么了扒接?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)们衙。 經(jīng)常有香客問(wèn)我钾怔,道長(zhǎng),這世上最難降的妖魔是什么蒙挑? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任宗侦,我火速辦了婚禮,結(jié)果婚禮上忆蚀,老公的妹妹穿的比我還像新娘矾利。我一直安慰自己,他們只是感情好馋袜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布男旗。 她就那樣靜靜地躺著,像睡著了一般欣鳖。 火紅的嫁衣襯著肌膚如雪察皇。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,258評(píng)論 1 300
  • 那天泽台,我揣著相機(jī)與錄音什荣,去河邊找鬼矾缓。 笑死,一個(gè)胖子當(dāng)著我的面吹牛溃睹,可吹牛的內(nèi)容都是我干的而账。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼因篇,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼泞辐!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起竞滓,我...
    開(kāi)封第一講書(shū)人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤咐吼,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后商佑,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體锯茄,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年茶没,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肌幽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡抓半,死狀恐怖喂急,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情笛求,我是刑警寧澤廊移,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站探入,受9級(jí)特大地震影響狡孔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蜂嗽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一苗膝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧徒爹,春花似錦荚醒、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至胖喳,卻和暖如春泡躯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工较剃, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留咕别,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓写穴,卻偏偏與公主長(zhǎng)得像惰拱,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子啊送,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

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