【面試大綱】Java集合-HashMap

聲明:以下內容純屬個人理解,有不正確之處請積極指正!

HashMap

底層是什么結構恐锦?

HashMap底層是數組+鏈表+紅黑樹滑燃,紅黑樹是在JDK1.8的時候引入的役听,引入紅黑樹的目的是為了優(yōu)化過長的鏈表,也就是說1.7之前的結構都是數組+鏈表

初始化參數有哪些典予?

默認初始容量 DEFAULT_INITIAL_CAPACITY = 16甜滨;
默認加載因子 DEFAULT_LOAD_FACTOR = 0.75;
閾值 threshold =0瘤袖;
樹化閾值 TREEIFY_THRESHOLD = 8衣摩;
取消樹化閾值 UNTREEIFY_THRESHOLD = 6;

擴容機制是怎樣的捂敌?

擴容主要取決于調用哪個構造函數0纭(下文容量就是指數組的長度)

  • 使用 new HashMap() 來創(chuàng)建實例,即沒有指定數組的初始容量占婉,此時數組還是 null泡嘴,那么當第一次執(zhí)行put(K key, V value) 方法添加元素時會初始化數組的容量為默認初始容量16,同時閾值 threshold = 16 * 0.75 = 12逆济。當數組的第13個位置添加了元素(當前數組已經有13個位置是非空酌予,不是指數組的下標),此時數組的元素個數 size 還是12(這里還沒有+1)奖慌,然后判斷 ++size>threshold(13>12)成立抛虫,觸發(fā)擴容,將數組的容量設置為原容量的2倍简僧,閾值設置為原閾值的2倍莱褒,即此時 數組.length = 32,threshold = 24涎劈。
  • 使用 new HashMap(int initialCapacity) 來創(chuàng)建實例广凸,則設置加載因子 loadFactor = 0.75,設置閾值 threshold 為大于 initialCapacity 并且是2的冪次方的數蛛枚,比如 initialCapacity = 20谅海,則 threshold = 25 = 32(源碼中是通過移位和或運算實現的,具體實現在 tableSizeFor(int cap) 方法)蹦浦;那么當第一次執(zhí)行put(K key, V value) 方法添加元素時會初始化數組的容量為 threshold 的值扭吁,所以當顯示指定數組的容量時,底層并不會按照你指定的容量來初始化數組盲镶,而是將數組的容量初始化為大于指定值并且是2的冪次方的值侥袜。然后當數組的第 25 個位置添加了元素(當前數組已經有25個位置是非空,不是指數組的下標)溉贿,此時數組的元素個數 size 還是24(這里還沒有+1)枫吧,然后判斷 ++size>threshold(25>24)成立,觸發(fā)擴容宇色,將數組的容量設置為原容量的2倍九杂,閾值設置為原閾值的2倍颁湖,即此時 數組.length = 64,threshold = 48例隆。

上面就是 HashMap 常用的兩種創(chuàng)建方式并且相應的擴容方式甥捺,對照源碼可能會更容易理解。

是否線程安全镀层?

非線程安全镰禾!
若要使用線程安全Map的可以考慮使用 Collections.synchronizedMap() 或 ConcurrentHashMap。

如何保證hash散列唱逢?或者說如何避免hash碰撞吴侦?

(1). 首先要找到元素存儲在數組中的位置
找到數組的位置是通過一個簡單的計算,即tab[i = (n - 1) & hash]惶我,等價于根據hash函數計算出的 hash 值對數組的長度也就是 length 取余妈倔,但取余的計算效率沒有位運算高,所以(n - 1) & hash也算是神來之筆绸贡,一個小的優(yōu)化吧盯蝴!

(2). 其次就是上面提到的hash函數,通過對 key 進行兩次hash運算听怕,增加hash復雜度捧挺。

  • 第一次:先計算 h = key.hashCode() ;
  • 第二次:計算 h ^ (h >>> 16),這里右移16位的意義何在尿瞭?因為 h 這里是int類型闽烙,int在java中占4個字節(jié),每個字節(jié)是8位声搁,也就是32位黑竞,前16位為高位,后16位為低位疏旨,計算余數時(緊跟第(1)步)很魂,由于 n 比較小,hash 只有低16位參與了計算檐涝,高位的計算可以認為是無效的遏匆。這樣導致了計算結果只與低位信息有關,高位數據沒發(fā)揮作用谁榜。為了處理這個缺陷幅聘,我們可以讓 hash 的高16位數據與低16位數據進行異或運算,即 hash ^ (hash >>> 16)窃植。通過這種方式帝蒿,讓高位數據與低位數據進行異或,以此加大低位信息的隨機性撕瞧,變相的讓高位數據參與到計算中陵叽。

使用場景有哪些狞尔?

需要存儲 鍵值對 key-value 類型數據時適用丛版。

使用時要注意什么巩掺?

重寫equals和hashCode方法!R称琛胖替!
當我們用HashMap存入自定義的類時,如果不重寫這個自定義類的equals和hashCode方法豫缨,得到的結果會和我們預期的不一樣独令。當然了,這里主要指的是HashMap的key部分好芭!

對于HashMap燃箭,一般面試能說出這些應該也差不多了,如果是高級面試舍败,對于紅黑樹以及HashMap的更詳細實現要是能跟面試官侃侃而談當然是最好不過了招狸!

常用Map類的不同?

Map中常用的有 HashMap邻薯、LinkedHashMap裙戏、TreeMap。

  • HashMap
    底層是數組+鏈表+紅黑樹結構厕诡;

  • LinkedHashMap
    它是繼承自HashMap的累榜,也就是說基本和HashMap類似,唯一的不同點就是它的底層是數組+雙向鏈表+紅黑樹灵嫌,引入雙向鏈表的目的是保證你插入map的元素的順序和你遍歷出來的元素的順序是一致的壹罚,這一點HashMap并沒有保證!

  • TreeMap
    它的底層是紅黑樹結構的寿羞;
    遍歷得到的元素是升序排列的猖凛。

上面小結的也只是我目前了解的一些,如果想要了解更多稠曼,可以參考下面的幾篇博文形病,寫的很棒,分析的也很透徹霞幅!
參考:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市司恳,隨后出現的幾起案子途乃,更是在濱河造成了極大的恐慌,老刑警劉巖扔傅,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耍共,死亡現場離奇詭異烫饼,居然都是意外死亡,警方通過查閱死者的電腦和手機试读,發(fā)現死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門杠纵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人钩骇,你說我怎么就攤上這事比藻。” “怎么了倘屹?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵银亲,是天一觀的道長。 經常有香客問我纽匙,道長务蝠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任烛缔,我火速辦了婚禮馏段,結果婚禮上,老公的妹妹穿的比我還像新娘力穗。我一直安慰自己毅弧,他們只是感情好,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布当窗。 她就那樣靜靜地躺著够坐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪崖面。 梳的紋絲不亂的頭發(fā)上元咙,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機與錄音巫员,去河邊找鬼庶香。 笑死,一個胖子當著我的面吹牛简识,可吹牛的內容都是我干的赶掖。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼七扰,長吁一口氣:“原來是場噩夢啊……” “哼奢赂!你這毒婦竟也來了?” 一聲冷哼從身側響起颈走,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤膳灶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體轧钓,經...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡序厉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了毕箍。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弛房。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖霉晕,靈堂內的尸體忽然破棺而出庭再,到底是詐尸還是另有隱情捞奕,我是刑警寧澤牺堰,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站颅围,受9級特大地震影響伟葫,放射性物質發(fā)生泄漏。R本人自食惡果不足惜院促,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一筏养、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧常拓,春花似錦渐溶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至掂恕,卻和暖如春拖陆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背懊亡。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工依啰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人店枣。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓速警,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鸯两。 傳聞我的和親對象是個殘疾皇子闷旧,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內容