HashMap 系列文章
- HashMap 的自定義常量分析
- HashMap 的構(gòu)造函數(shù)分析
- HashMap 的 hash 算法和尋址地址的優(yōu)化
前言
HashMap 中有很多自定義的參數(shù)蚌吸,這些參數(shù)都有哪些侣灶?作用分別是什么呢喷市?接下來(lái),小李分別為你們進(jìn)行講解。
DEFAULT_INITIAL_CAPACITY
默認(rèn)初始化的容量呢堰,必須是 2 的 n 次方屿聋。默認(rèn)大小是 16,通過(guò) HashMap 的無(wú)參構(gòu)造函數(shù)創(chuàng)建 HashMap臭墨,那么 HashMap 的初始化大小就是 DEFAULT_INITIAL_CAPACITY赔嚎。
DEFAULT_LOAD_FACTOR
默認(rèn)的加載因子,0.75。加載因子有什么作用呢尤误?就是為了計(jì)算下面要說(shuō)的閾值侠畔。
為什么 DEFAULT_LOAD_FACTOR 默認(rèn)值是 0.75 呢?
如果值太小损晤,會(huì)造成空間的浪費(fèi)软棺;
值太大,會(huì)造成更多的 hash 沖突尤勋;
所以通過(guò)大數(shù)據(jù)的計(jì)算喘落,加載因子為 0.75 的時(shí)候是比較折中的做法。
loadFactor
hash 表的加載因子斥黑,默認(rèn)就是 DEFAULT_LOAD_FACTOR 揖盘,可以通過(guò)構(gòu)造函數(shù)進(jìn)行設(shè)置。
threshold
閾值锌奴,計(jì)算方式是 capacity * load factor兽狭,如果是默認(rèn)計(jì)算的話,閾值就是 16 * 0.75=12鹿蜀。也就是說(shuō)箕慧,當(dāng)表的長(zhǎng)度大于 12 的時(shí)候,就需要調(diào)用 resize()茴恰,進(jìn)行擴(kuò)容的操作颠焦。
entrySet
緩存 enrySet() 方法的數(shù)據(jù),通過(guò) entrySet 可以獲取所有的鍵值對(duì)記錄往枣,用于循環(huán) HashMap 的鍵值對(duì)伐庭。
MAXIMUM_CAPACITY
最大的容量 1 <<30,相當(dāng)于 2^30 分冈,容量必須是 2 的 n 次方圾另,并且小于等于 MAXIMUM_CAPACITY。如果大于 2^30 雕沉,會(huì)賦予 Integer.MAX_VALUE集乔,也就是 2^31 - 1。
MIN_TREEIFY_CAPACITY
轉(zhuǎn)換成紅黑樹需要的最少的表格容量坡椒。
TREEIFY_THRESHOLD
判斷節(jié)點(diǎn)數(shù)量大于等于 8 的時(shí)候扰路,就需要開始進(jìn)行一個(gè)節(jié)點(diǎn)轉(zhuǎn)成紅黑樹的一個(gè)操作,就是 treeifyBin方法倔叼。但是在轉(zhuǎn)成紅黑樹的時(shí)候還有個(gè)條件汗唱,就是表的大小應(yīng)該大于等于 MIN_TREEIFY_CAPACITY,否則會(huì)進(jìn)行 resize() 的操作丈攒。
UNTREEIFY_THRESHOLD
判斷節(jié)點(diǎn)索引小于等于 6 (節(jié)點(diǎn)是從 0 開始的)渡嚣,就會(huì)調(diào)用 untreeify 方法,返回一個(gè)非 TreeNode 的列表,該列表替換非 TreeNode 節(jié)點(diǎn)的內(nèi)容识椰。
總結(jié)
本節(jié)主要帶大家了解了 HashMap 的一些基本常量分析绝葡,帶大家一起回顧一下:
- DEFAULT_INITIAL_CAPACITY:默認(rèn)初識(shí)表格的容量,值為 16腹鹉,必須是 2 的 n 次方藏畅;
- DEFAULT_LOAD_FACTOR:默認(rèn)加載因子,值為 0.75;
- loadFactor: 加載因子功咒,可以通過(guò)構(gòu)造函數(shù)設(shè)置 loadFactory;
- threshold:閾值愉阎,當(dāng) hash 表的 size 大于這個(gè)值得時(shí)候,需要進(jìn)行 resize 擴(kuò)容操作力奋,公式是 capacity * load factor;
- entrySet:緩存 entrySet() 方法的數(shù)據(jù)榜旦,可以對(duì)鍵或者值進(jìn)行遍歷。
- MIN_TREEIFY_CAPACITY:節(jié)點(diǎn)轉(zhuǎn)換成紅黑樹需要的最少的表格容量景殷,值是 64;
- TREEIFY_THRESHOLD:判斷節(jié)點(diǎn)是否需要轉(zhuǎn)成紅黑樹節(jié)點(diǎn)溅呢,值是 8;
- UNTREEIFY_THRESHOLD:判斷是否需要調(diào)用 untreeify 方法猿挚,值是 6咐旧。
下一講會(huì)帶來(lái) HashMap 的構(gòu)造函數(shù)講解。