hashmap应用场景_Java初学者进阶系列:HashMap的容量与性能
1. HashMap的容量與性能
HashMap的性能受到兩個(gè)參數(shù)的影響:初始化容量和負(fù)載因子,下面來(lái)詳細(xì)講述這幾個(gè)關(guān)鍵問(wèn)題。
1.1 Initial Capacity與Load Factor
- Initial Capacity:初始化容量,它表示HashMap底層的那個(gè)數(shù)組,也就是Entry數(shù)組有多長(zhǎng),這個(gè)值默認(rèn)是16。
- Load Factor:負(fù)載因子,它表示HashMap的負(fù)載程度,換句話說(shuō),它表示HashMap到底有多滿了,是不是需要擴(kuò)容了,這個(gè)值默認(rèn)是0.75f。
初始化容量和負(fù)載因子的默認(rèn)值是Java官方經(jīng)過(guò)實(shí)踐和優(yōu)化得到的數(shù)據(jù),可以適應(yīng)大多數(shù)的場(chǎng)景。
當(dāng)然也可以不使用其默認(rèn)值,可以在構(gòu)造的時(shí)候,自定義HashMap的容量和負(fù)載因子:
//單純指定容量 Map<String,String> hashMapWithCapacity=new HashMap<>(64); //自定義容量和負(fù)載因子 Map<String,String> hashMapWithCapacityAndLF=new HashMap<>(64, 0.9f);一旦需要自定義容量和負(fù)載因子,我們需要搞清楚,他們到底是什么,用來(lái)干嘛,會(huì)對(duì)性能造成什么影響。
一句話:這兩個(gè)數(shù)值會(huì)影響到HashMap的擴(kuò)容,而擴(kuò)容是一個(gè)對(duì)性能影響非常大的操作。
1.2 HashMap的擴(kuò)容
1.2.1 擴(kuò)容是什么
HashMap的擴(kuò)容:HashMap被初始化之后,其容量是有限的(可以是默認(rèn),也可以是自定義的),當(dāng)元素不斷被插入,是HashMap達(dá)到一定的程度(負(fù)載因子決定),這個(gè)時(shí)候,HashMap就會(huì)擴(kuò)容。
根據(jù)源碼,使用公式表示,是否擴(kuò)容由容量和負(fù)載因子的乘積決定!!!!
觸發(fā)擴(kuò)容的條件: HashMap.Size >= Capacity * LoadFactor- HashMap.Size:當(dāng)前HashMap的實(shí)際元素個(gè)數(shù)
- Capacity:容量
- LoadFactor:負(fù)載因子
如果在默認(rèn)值的條件下:
HashMap.Size = 16 * 0.75 = 12也就是,默認(rèn)的情況下,插入十二個(gè)元素的時(shí)候,就會(huì)觸發(fā)擴(kuò)容。
1.2.2 擴(kuò)容的步驟
一旦HashMap的size超過(guò)了Capacity * LoadFactor乘積,就會(huì)觸發(fā)擴(kuò)容,那如何擴(kuò)容呢?,需要經(jīng)過(guò)兩步:
- resize:即:創(chuàng)建一個(gè)new Entry數(shù)組,長(zhǎng)度是原來(lái)old Entry的2倍。
- rehash:遍歷old Entry數(shù)組,把里面的每一個(gè)元素取出來(lái)重新計(jì)算hash和index。為什么要重新計(jì)算呢?想一想之前的index計(jì)算公式:
對(duì),因?yàn)殚L(zhǎng)度已經(jīng)改了,所以index肯定會(huì)不一樣,舉個(gè)例子:
- 當(dāng)原數(shù)組長(zhǎng)度為16時(shí),Hash運(yùn)算是和1111做與運(yùn)算;
- 新數(shù)組長(zhǎng)度為32,Hash運(yùn)算是和11111做與運(yùn)算。
Hash結(jié)果顯然不同。
1.3 容量與性能(常見(jiàn)問(wèn)題)
綜上所述,不同的容量和負(fù)載因子的設(shè)置,會(huì)導(dǎo)致hashmap的擴(kuò)容頻率不一致。所以:
- Initial Capacity設(shè)置得低,存儲(chǔ)空間少,但是增加了rehash的頻率。所以如果能夠預(yù)期到會(huì)存儲(chǔ)比較多的數(shù)據(jù),那么這個(gè)值應(yīng)該設(shè)置高一點(diǎn)
- Initial Capacity設(shè)置得高,存儲(chǔ)空間多,rehash頻率少。但是會(huì)增加迭代的成本。
所以總結(jié)一個(gè)場(chǎng)景
- Initial Capacity設(shè)置高:大量存儲(chǔ),少量迭代
- Initial Capacity設(shè)置低:數(shù)據(jù)少,迭代頻繁
常見(jiàn)問(wèn)題:
- 如何擴(kuò)容的
- 初始化容量是多少,如何設(shè)置,有什么應(yīng)用場(chǎng)景
- 負(fù)載因子的作用是什么
歡迎大家一起交流!
總結(jié)
以上是生活随笔為你收集整理的hashmap应用场景_Java初学者进阶系列:HashMap的容量与性能的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: cisco 2960 VLAN MAC_
- 下一篇: matlab疲劳驾驶_第一本无人驾驶技术