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