map實現(xiàn)原理以及擴容規(guī)則

map 是個 key-value 的存儲結構,常用的實現(xiàn)有兩種砸逊,HashMap和TreeMap悉罕。

??HashMap 是通過hash方式實現(xiàn)的map赤屋,底層存儲在一個數(shù)組中立镶。hashmap在初始化時,默認會創(chuàng)建一個長度為16的數(shù)組类早。當我們調(diào)用put方法時(例如map.put(2,'hxl'))媚媒,hashmap會獲取key的hash值。將這個hash值與長度進行&操作莺奔,算出的值就是數(shù)據(jù)存在數(shù)組中的下標欣范。

??& 的性能比較高,在和數(shù)組的長度計算時令哟,要求數(shù)組的長度必須是 2^n 2 ,當初始化長度指定長度不是2^n 妨蛹,會將其進行一個轉換屏富。

??Hash碰撞。 如果兩個key算出的下標是同一位置蛙卤,那么就會出現(xiàn)hash碰撞狠半。在JDK8之前,hashmap采用了鏈表的方式解決碰撞問題颤难,也就是說新數(shù)據(jù)會作為一個鏈表的節(jié)點鏈接在前一個節(jié)點中神年。該方法會存在鏈表問題,時間復雜度為 O ( n ) O(n) O(n)行嗤,所以在JDK8之后就把鏈表改成了鏈表+紅黑樹已日。在碰撞數(shù)小于8時,采用的是鏈表栅屏。到8個時會轉換成紅黑樹飘千。另外map的數(shù)組小于64時,不會轉換成數(shù)栈雳,而是進行依次擴容护奈。

??當調(diào)用map的put方法時,hashmap是用equals方法判斷兩個key是否相等哥纫,相等則覆蓋霉旗。因為需要用hash算出key,所以當把對象作為key時蛀骇,需要重寫兩個方法厌秒,一個是equals方法,還有一個是重寫hashcode方法松靡。

??擴容 hashmap的底層是數(shù)組存儲简僧,會涉及到擴容的問題。hashmap計算新數(shù)組長度的方式就是用舊的長度向左移1位雕欺,也就是新數(shù)組是舊數(shù)組的2倍岛马。

??擴容時間 第一種:碰撞數(shù)大于等于8棉姐,且數(shù)組小于64。第二種:當 存儲的數(shù)據(jù)個數(shù) > 數(shù)組長度 ? 0.75 存儲的數(shù)據(jù)個數(shù) > 數(shù)組長度*0.75 存儲的數(shù)據(jù)個數(shù)>數(shù)組長度?0.75 這個0.75是默認的加載因子啦逆。在初始化hashmap的時候就可以進行指定伞矩。

??擴容的方式,就是把舊數(shù)組中的數(shù)據(jù)重新計算hash(rehash)夏志,然后放到新數(shù)組中乃坤,rehash是比較消耗性能的,所以我們要盡量減少rehash的出現(xiàn)沟蔑。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末湿诊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子瘦材,更是在濱河造成了極大的恐慌厅须,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件食棕,死亡現(xiàn)場離奇詭異朗和,居然都是意外死亡,警方通過查閱死者的電腦和手機簿晓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門眶拉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人憔儿,你說我怎么就攤上這事忆植。” “怎么了皿曲?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵唱逢,是天一觀的道長。 經(jīng)常有香客問我屋休,道長坞古,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任劫樟,我火速辦了婚禮痪枫,結果婚禮上,老公的妹妹穿的比我還像新娘叠艳。我一直安慰自己奶陈,他們只是感情好,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布附较。 她就那樣靜靜地躺著吃粒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拒课。 梳的紋絲不亂的頭發(fā)上徐勃,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天事示,我揣著相機與錄音,去河邊找鬼僻肖。 笑死肖爵,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的臀脏。 我是一名探鬼主播劝堪,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼揉稚!你這毒婦竟也來了秒啦?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤窃植,失蹤者是張志新(化名)和其女友劉穎帝蒿,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體巷怜,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年暴氏,在試婚紗的時候發(fā)現(xiàn)自己被綠了延塑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡答渔,死狀恐怖关带,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情沼撕,我是刑警寧澤宋雏,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站务豺,受9級特大地震影響磨总,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜笼沥,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一蚪燕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧奔浅,春花似錦馆纳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至舞骆,卻和暖如春钥弯,著一層夾襖步出監(jiān)牢的瞬間径荔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工寿羞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留猖凛,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓绪穆,卻偏偏與公主長得像辨泳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子玖院,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355

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