HashMap的確有很多細節值得我們注意,正如被問到HashMap加載因子為什麼是0.75?,好了廢話不多說,直接上源碼分享。
HashMap加載因子是什麼?
HashMap的底層結構是哈希表 ,是以鍵值對形式存儲的。在存HashMap儲過程中,首先會通過hash計算出哈希值才能知道數據要存儲在哈希表中的某個位置。
但是這樣的存儲有個問題:
在存在數據時,我們是通過哈希算法計算出要存儲的位置,但是有可能該位置已經有數據存儲了,這時候就會產生哈希衝突的問題。還有一個問題就是,如果為了避免哈希衝突,而增大數組容量來減少哈希衝突問題,有可能會導致數組空間浪費或者空間小的問題。而加載因子就是決定HashMap的數據密度
公式:加載因子=填入表中元素/散列表的長度
如果負載因子設置過大或過小會有什麼問題?
首先知道負載因子的大小是主要就是決定了HashMap的數據密度的嘛如果負載因子越大數據密度越大,就會可能發生碰撞的機率越高,數組中的鍊表也會越容易長, 這樣的話造成查詢和插入時的比較次數增多,性能會下降。(可能又引出一個面試題:如何解決Hash碰撞問題?)如果負載因子越小,就會越容易觸發擴容,雖然數據密度也越小,發生碰撞機率小,數組中鍊表越短對於查詢和插入時比較次數也會少一些,性能也會提高。但是擴容會影響性能,所以建議初始化預設給它大一點空間。那你覺得負載因子設置為多少較為合理
HashMap 初始容量大小默認是16,這是為了減少衝突發生的概率,當HashMap的數組長度到達一個臨界值的時候,就會觸發擴容,把所有元素rehash之後再放在擴容後的容器中,這是一個相當耗時的操作,所以擴容是件影響性能的。
而這個臨界值就是由加載因子和當前容器的容量大小來確定的,公式:
臨界值:默認容量大小16*加載因子,即默認是16乘0.75=12此時就會發生擴容操作
我會考慮將負載因子設置為0.7~0.75,因為此時平均檢索長度接近於常數了,這樣會更好一些。
如果想要獲取【Java後端複習腦圖、學習路線】,關注我且私信「思維腦圖」。