天天看點

HashMap初始容量

在已知HashMap中将要存放的KV個數的時候,設定一個合理的初始化容量可以有效的提高性能。

HashMap預設初始容量:16 (即2<<3)

别問為什麼,太大浪費記憶體,太小頻繁擴容,16是一個在性能和資源之間相對折中的選擇;

我們可以在new HashMap時顯式指定容量大小

HashMap<String, Object> map = new HashMap<>(expectedSize );      

但是!!

事情沒你想得那麼簡單

你指定容量大小後,實際初始容量大小并不一定是你指定的容量大小,因為HashMap的發明者認為實際需要的容量大小往往大于你在new HashMap時預估的大小expectedSize ,是以HashMap底層會對你指定的expectedSize 進行處理,處理後的expectedSize 才是實際容量大小;

底層容量處理

Hash會選擇第一個大于等于你傳入expectedSize 的第一個2的幂作為容量

HashMap初始容量

比如

new HashMap<>(3),那麼實際初始容量大小為4;

new HashMap<>(4),那麼實際初始容量大小為4;

new HashMap<>(5),那麼實際初始容量大小為8;

new HashMap<>(7),那麼實際初始容量大小為8;

new HashMap<>(10),那麼實際初始容量大小為16;

new HashMap<>(16),那麼實際初始容量大小為16;

new HashMap<>(23),那麼實際初始容量大小為32;

這裡多舉一些例,友善大家了解