HashMap 的構造函數分析

HashMap 系列文章

前言

上一節(jié)我們分析了 HashMap 的自定義常量的含義掠哥,這一節(jié)帶大家分析一下 HashMap 的構造函數。


HashMap 構造函數

HashMap()

HashMap 無參構造函數秃诵,默認 table 初始化是 16龙致,默認的加載因子是 0.75,這個在上一講也講過了顷链,DEFAULT_INITIAL_CAPACITY 是 16,DEFAULT_LOAD_FACTOR 是 0.75屈梁。


HashMap()

HashMap(int initialCapacity)

HashMap(int initialCapacity)嗤练,可以對容量進行設置,加載因子是 DEFAULT_LOAD_FACTOR 在讶,調用的是下面的有參構造函數煞抬。


HashMap(int initialCapacity)

HashMap(int initialCapacity, float loadFactor)

HashMap(int initialCapacity, float loadFactor),可以指定容量和加載因子构哺。容量不可以小于 0 革答,也不可以無限大。加載因子也不能是 0 曙强,也不能比 0 小残拐。并且不能是 NaN (詳見)。
然后給 loadFactor 進行賦值碟嘴,并且給對閾值 threshold 進行設置溪食。我們可以看一下 tabSizeFor 方法。

HashMap(int initialCapacity, float loadFactor)

對于給定的容量進行計算娜扇,返回 2 的 n 次方错沃。那這塊的計算規(guī)則,我給你們講解一下雀瓢。

tabSizeFor

首先我們看一下運算符的優(yōu)先級 (詳見)

我們知道先進行位移預算枢析,再進行與運算,然后再給 n 進行賦值刃麸。

這塊的意思是什么醒叁,就是以你的最高位為基準,然后讓后面的位置都是1嫌蚤。

那我舉個例子辐益,你就明白了,

比如 cap 是 17脱吱,那么 n 就是 17-1 = 16

16 對應的二進制是 10000智政。

那咱們一步一步的算:

首先

n |= n>>>1

n >>> 1,標識 n 右移 1 位箱蝠,那么 n = 01000

10000 | 01000 = 11000

n = 11000

第二步

n >>> 2, 標識 n 右移 2 位续捂,那么 n = 00110

11000|00110 = 11110

n = 11110

第三步

得到 n = 11111

最終就得到 n = 11111 也就是換算成十進制也就是 31垦垂,那返回結果就是 31+1 = 32

所以不管你輸入的是多少,比如十進制 100 換算成二進制就是 1100100 那么得到的結果就是 1111111 就是 127牙瓢,那返回結果就是 128劫拗。

而為什么偏要是 2 的 n 次方呢?這里提前透露一下矾克,當進行 put 的時候页慷,會計算 hash 值,然后進行 hash 值得優(yōu)化胁附,并且把優(yōu)化后的 hash 值和 size-1 進行一個與(&)運算酒繁。這個會在后續(xù)進行更詳細的講解。

HashMap(Map<? extends K, ? extends V> m)

HashMap(Map map) 創(chuàng)建一個新的 HashMap 控妻,加載因子是 DEFAULT_LOAD_FACTOR 州袒。然后通過 putMapEnries 將 map 的值存儲到新的 HashMap 中。

HashMap(Map<? extends K, ? extends V> m)

putMapEntries 方法主要分為三步

  1. 如果 HashMap 沒有創(chuàng)建弓候,給閾值設值郎哭。
  2. 如果 HashMap 不為 null,根據閾值判斷是否需要擴容菇存。
  3. 通過 entrySet() 獲取 map 的所有鍵值夸研,通過循環(huán),用 getKey() 和 getValue() 獲取鍵值依鸥,然后 put 到新的 HashMap 中陈惰。


    putMapEntries 方法

總結

HashMap 有四個構造函數,分別是:

  • HashMap()
  • HashMap(int initialCapacity)
  • HashMap(int initialCapacity, float loadFactor)
  • HashMap(Map<? extends K, ? extends V> m)

通過構造函數可以設置容量和加載因子毕籽,容量必須大于 0 抬闯,最大不能超過 MAXIMUM_CAPACITY,而且通過 tabSizeFor(int cap) 方法返回 2 的 n 次方关筒,并且賦值給 threshold溶握。threshold 是 HashMap 的閾值,在 resize() 方法初始化 table 的時候蒸播,threshold 是初始化 table 的容量大小睡榆。這個 resize() 方法在后面會詳細講解。所以為了減少擴容和 hash 沖突袍榆,我們可以在創(chuàng)建 HashMap 的時候提前控制容量和加載因子的大小胀屿,來提升系統的性能。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末包雀,一起剝皮案震驚了整個濱河市驻售,隨后出現的幾起案子御板,更是在濱河造成了極大的恐慌,老刑警劉巖咐柜,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件臊泰,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門吆鹤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人洲守,你說我怎么就攤上這事疑务。” “怎么了梗醇?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵暑始,是天一觀的道長。 經常有香客問我婴削,道長,這世上最難降的妖魔是什么牙肝? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任唉俗,我火速辦了婚禮,結果婚禮上配椭,老公的妹妹穿的比我還像新娘虫溜。我一直安慰自己,他們只是感情好股缸,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布衡楞。 她就那樣靜靜地躺著,像睡著了一般敦姻。 火紅的嫁衣襯著肌膚如雪瘾境。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天镰惦,我揣著相機與錄音迷守,去河邊找鬼。 笑死旺入,一個胖子當著我的面吹牛兑凿,可吹牛的內容都是我干的。 我是一名探鬼主播茵瘾,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼礼华,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了拗秘?” 一聲冷哼從身側響起圣絮,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎雕旨,沒想到半個月后晨雳,有當地人在樹林里發(fā)現了一具尸體行瑞,經...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年餐禁,在試婚紗的時候發(fā)現自己被綠了血久。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡帮非,死狀恐怖氧吐,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情末盔,我是刑警寧澤筑舅,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站陨舱,受9級特大地震影響翠拣,放射性物質發(fā)生泄漏。R本人自食惡果不足惜游盲,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一误墓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧益缎,春花似錦谜慌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至令哟,卻和暖如春恼琼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背屏富。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工驳癌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人役听。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓颓鲜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親典予。 傳聞我的和親對象是個殘疾皇子甜滨,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內容

  • 一、HashMap概述 HashMap基于哈希表的Map接口的實現瘤袖。此實現提供所有可選的映射操作衣摩,并允許使用nul...
    小陳阿飛閱讀 633評論 0 2
  • 感謝 shixinzhang的文章, 參考此:https://blog.csdn.net/u011240877/a...
    loveinthesweet閱讀 411評論 0 0
  • HashMap簡介HashMap基于哈希表的 Map 接口的實現。此實現提供所有可選的映射操作,并允許使用 nul...
    小小的coder閱讀 241評論 0 0
  • HashMap HashMap概述 HashMap基于哈希表的 Map 接口的實現艾扮。此實現提供所有可選的映射操作既琴,...
    史路比閱讀 291評論 0 6
  • 2017.11.1 星期三 晴 今晚給倆寶每人又做了一大份水果沙拉??,倆寶吃的開心極了泡嘴。吃過晚飯就來顧客了甫恩,工...
    廈門路小學邵藝馨媽媽閱讀 168評論 0 6