面試官經(jīng)常被問到的問題,Java中的HashMap

? ? ? ? 想必經(jīng)歷過面試的人很多都能被問到這個問題桐款,當(dāng)然小編也不例外咸这,今天就給大家剖析一下HashMap在jdk1.8中的結(jié)構(gòu)及其使用,分享在這鲁僚,從中自己也在學(xué)習(xí)炊苫,不斷積累技術(shù)和大家一起分享

一:概述

? ? ? HashMap最早在jdk1.2中就存在了,HashMap繼承自父類(AbstractMap)冰沙,實現(xiàn)了Map侨艾、Cloneable、Serializable接口拓挥,底層思想是基于散列算法實現(xiàn)的唠梨,HashMap可以用null作為鍵,也可以用null作為值侥啤,當(dāng)存儲的鍵為null時当叭,對應(yīng)計算的結(jié)果是0茬故,用0作為鍵值的,HashMap不是線程安全的蚁鳖,如果使用HashMap要滿足線程安全磺芭,可以使用Collectio類的的synchronizedMap方法使HashMap具有線程安全的能力,或者使用ConcurrentHashMap類醉箕。


一:數(shù)據(jù)的存儲結(jié)構(gòu)


? ? ? 在jdk1.7中的HashMap中的數(shù)據(jù)結(jié)構(gòu)是數(shù)組+單鏈表的組合钾腺,使用鏈表處理hash值沖突的元素,而存在的問題就是當(dāng)hash鍵值相等的情況較多時讥裤,都會將值保存在一個單鏈表上放棒,也就是其中的一個桶中,導(dǎo)致通過key值去查找效率很低己英,所以在jdk1.8中间螟,HashMap采用了數(shù)組+鏈表+紅黑樹來實現(xiàn),這在結(jié)構(gòu)上與jdk 1.7最大的不同损肛,而在jdk1.8中厢破,如果hash鍵值沖突較多時,單鏈表的長度超過規(guī)定的臨界值(8)時,就會將鏈表轉(zhuǎn)換成紅黑樹的結(jié)構(gòu)存儲荧关,這樣就能高效的查詢溉奕,提高HashMap的查詢效率褂傀。


? ? ? 1. HashMap成員變量:?

? ? ? ? ? ? * The default initial capacity - MUST be a power of two.

? ? ? ? ? ? *? 默認HashMap初始化的容量為16忍啤,且長度必須為2的冪等

? ? ? ? ? ? */

? ? ? ? ? ? static final int DEFAULT_INITIAL_CAPACITY = 16;

? ? ? ? /**

? ? ? ? ? ? * The table, resized as necessary. Length MUST Always be a power of two.

? ? ? ? ? ? ? ? * 數(shù)組是存儲HashMap的鏈表表頭

? ? ? ? ? ? */

? ? ? ? ? ? transient Entry<K,V>[] table

? ? ? ? ? ? /** 最大初始容量,2^30 */

? ? ? ? ? ? static final int MAXIMUM_CAPACITY = 1 << 30;

? ? ? ? ? /** 負載因子仙辟,默認0.75同波,負載因子越小,hash沖突機率越低 */

? ? ? ? ? static final float DEFAULT_LOAD_FACTOR = 0.75f;

? ? ? ? ? /** 初始化一個Entry的空數(shù)組 */

? ? ? ? ? static final Entry<?,?>[] EMPTY_TABLE = {};

? ? ? ? ? /** HashMap實際存儲的元素個數(shù) */

? ? ? ? ? transient int size;

? ? ? ? ? /** 臨界值(HashMap 實際能存儲的大械),公式為(threshold = capacity * loadFactor) */

? ? ? ? ? int threshold;


? ? ? ? ? /** 負載因子 */

? ? ? ? final float loadFactor;

? ? ? ? ? /** HashMap的結(jié)構(gòu)被修改的次數(shù)未檩,用于迭代器 */

? ? ? ? transient int modCount;

2:HashMap的數(shù)組

圖片發(fā)自簡書App

圖1


3:紅黑樹結(jié)構(gòu)及性質(zhì)介紹


? ? 紅黑樹其實就是一種自平衡的二叉查找樹,他這個自平衡的特性就是針對HashMap中鏈表可能會很長粟焊,做出的優(yōu)化冤狡。紅黑樹是每個節(jié)點都帶有顏色屬性的二叉查找樹,顏色或紅色或黑色项棠。在二叉查找中有的性質(zhì)外悲雳,紅黑樹也有自己的特點:


特點1. 節(jié)點都是紅色或黑色,所以稱為紅黑樹香追。


特點2. 樹的根節(jié)點是黑色合瓢。


特點3. 每個葉節(jié)點(NIL節(jié)點,空節(jié)點)是黑色的透典。


特點4. 每個紅色節(jié)點的兩個子節(jié)點都是黑色晴楔。(從每個葉子到根的所有路徑上不能有兩個連續(xù)的紅色節(jié)點)


特點5. 從任一節(jié)點到其每個葉子的所有路徑都包含相同數(shù)目的黑色節(jié)點顿苇。




static final class TreeNode<k,v> extends LinkedHashMap.Entry<k,v> {

? ? TreeNode<k,v> parent;? // 父節(jié)點

? ? TreeNode<k,v> left; //左子樹

? ? TreeNode<k,v> right;//右子樹

? ? TreeNode<k,v> prev;? ? // needed to unlink next upon deletion

? ? boolean red;? ? //顏色屬性

? ? TreeNode(int hash, K key, V val, Node<k,v> next) {

? ? ? ? super(hash, key, val, next);

? ? }

圖片發(fā)自簡書App


4:HashMap的擴容機制


? ? HashMap中含有resize()方法,當(dāng)HashMap的元素個數(shù)超過數(shù)組的容量長度(length)HashMap就會進行擴容,默認情況下數(shù)組容量是16,當(dāng)HashMap中的元素個數(shù)超過12個時(16*0.75 == 12),就超過了臨界值(也就是源碼中的threshold),這時税弃,HashMap就需要把數(shù)組大小擴容到原來的一倍,然后通過rehash(再哈希),重新計算每個元素在數(shù)組中的位置.

獲取更多視頻資料纪岁,請關(guān)注微信公眾號

圖片發(fā)自簡書App
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市则果,隨后出現(xiàn)的幾起案子蜂科,更是在濱河造成了極大的恐慌,老刑警劉巖短条,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件导匣,死亡現(xiàn)場離奇詭異,居然都是意外死亡茸时,警方通過查閱死者的電腦和手機贡定,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來可都,“玉大人缓待,你說我怎么就攤上這事∏” “怎么了旋炒?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長签杈。 經(jīng)常有香客問我瘫镇,道長,這世上最難降的妖魔是什么答姥? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任铣除,我火速辦了婚禮,結(jié)果婚禮上鹦付,老公的妹妹穿的比我還像新娘尚粘。我一直安慰自己,他們只是感情好敲长,可當(dāng)我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布郎嫁。 她就那樣靜靜地躺著,像睡著了一般祈噪。 火紅的嫁衣襯著肌膚如雪泽铛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天钳降,我揣著相機與錄音厚宰,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛铲觉,可吹牛的內(nèi)容都是我干的澈蝙。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼撵幽,長吁一口氣:“原來是場噩夢啊……” “哼灯荧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起盐杂,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤逗载,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后链烈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體厉斟,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年强衡,在試婚紗的時候發(fā)現(xiàn)自己被綠了擦秽。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡漩勤,死狀恐怖感挥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情越败,我是刑警寧澤触幼,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站究飞,受9級特大地震影響置谦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜噪猾,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一霉祸、第九天 我趴在偏房一處隱蔽的房頂上張望筑累。 院中可真熱鬧袱蜡,春花似錦、人聲如沸慢宗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽镜沽。三九已至敏晤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間缅茉,已是汗流浹背嘴脾。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人译打。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓耗拓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親奏司。 傳聞我的和親對象是個殘疾皇子乔询,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,573評論 2 353

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

  • 一竿刁、基本數(shù)據(jù)類型 注釋 單行注釋:// 區(qū)域注釋:/* */ 文檔注釋:/** */ 數(shù)值 對于byte類型而言...
    龍貓小爺閱讀 4,259評論 0 16
  • 摘要 HashMap是Java程序員使用頻率最高的用于映射(鍵值對)處理的數(shù)據(jù)類型。隨著JDK(Java Deve...
    周二倩你一生閱讀 1,249評論 0 5
  • 本系列出于AWeiLoveAndroid的分享搪缨,在此感謝食拜,再結(jié)合自身經(jīng)驗查漏補缺,完善答案副编。以成系統(tǒng)监婶。 Java基...
    濟公大將閱讀 1,528評論 1 6
  • 時間是自稱包治百病的庸醫(yī),今天才意識到我還留有后遺癥齿桃。 自從某件事情以后惑惶,我自認為我已經(jīng)變得平和了許多,可是今天被...
    susan不忘初心閱讀 145評論 0 0
  • 電影短纵、音樂带污、電視劇,這些消磨時間的利器香到,奪去了多少人的時間鱼冀。這些人的時間浪費了不說,還被別人冠以“不務(wù)正業(yè)”的壞名...
    三丘的世界閱讀 373評論 0 0