HashMap使用initalCapacity初始化值進行性能優化


  我們一般在使用new HashMap<T>()時,有時候不會做容量大小的設置。但是這樣使用的結果是可能會造成一些內存浪費;因此,知道存儲的鍵值對的數量的情況下,做初始化較好。

一、創建HashMap

  新建一個HashMap的時候,可以通過initialCapacity設置HashMap長度的初始化值。如:Map<String, Object> resultMap = new HashMap<String, Object>(initialCapacity: 5);
在hashMap源碼中initialCapacity的初始值為16,負載因子為0.75;所以一個hashMap中默認存儲長度為16 * 0.75 = 12,也就是如果hashMap.put的鍵值對數量小於12的時候,hashMap位置夠用;
但是當添加的鍵值對數超過12后,hashMap需要擴容,一倍,也就是長度從12擴容到24;例如鍵值對一共13個,這樣剩余11個位置性能都浪費了,那么如果已知需要添加的鍵值對數量,就可以通過
設置initialMap的值,來避免hashMap擴容,減少性能消耗。我們需要往hashMap中添加6個鍵值對,6 / 0.75 = 8;那就可以把initialCapacity設置為9比較合適,節省性能。

二、原理

  公式是《阿里巴巴Java開發手冊》中的一個建議,在Guava中也是提供了相同的算法,更甚之,這個算法實際上是JDK8中putAll()方法的實現。這是公式的得出是因為,當HashMap內部維護的哈希表的容量達到75%時(默認情況下),就會觸發rehash(重建hash表)操作。而rehash的過程是比較耗費時間的。所以初始化容量要設置成expectedSize/0.75 + 1 的話,可以有效地減少沖突,也可以減小誤差”。我的理解是:當數組長度是可容納長度的75%時,就會重新建立數組,產生額外開銷,所以這個預期的數組長度要小於可容納的長度的75%,也就是 (initialCapacity – 1 ) * 0.75 = 預期數組長度 ,即 initialCapacity * 0.75 > 預期數組長度。

三、公式

最后,千言萬語都匯成最后這一個容量公式:initialCapacity = expectedSize/0.75 + 1

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM