問:HashMap初始大小和擴容后的大小
HashMap:默認初始容量為16(為何是16,16是2^4,可以提高查詢效率,另外,32=16<<1 ) -->至於詳細的原因可另行分析,或分析源代碼)
查看hashmap源碼及其注釋后發現這句代碼:
/** * The default initial capacity - MUST be a power of two. */ static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
加載因子為0.75:即當 元素個數超過容量長度的0.75倍 時,進行擴容
擴容增量:原容量的 1 倍 擴容后的大小為32
本文,通過分析為什么HashMap的默認容量是16,我們深入HashMap的原理,分析了下背后的原理,從代碼中我們可以發現,JDK 的工程師把各種位運算運用到了極致,想盡各種辦法優化效率。值得我們學習!
HashMap默認容量為何為16?
什么是容量
在Java中,保存數據有兩種比較簡單的數據結構:數組和鏈表。數組的特點是:尋址容易,插入和刪除困難;而鏈表的特點是:尋址困難,插入和刪除容易。HashMap就是將數組和鏈表組合在一起,發揮了兩者的優勢,我們可以將其理解為鏈表的數組。在HashMap中,有兩個比較容易混淆的關鍵字段:size和capacity ,這其中capacity就是Map的容量,而size我們稱之為Map中的元素個數。簡單打個比方你就更容易理解了:HashMap就是一個“桶”,那么容量(capacity)就是這個桶當前最多可以裝多少元素,而元素個數(size)表示這個桶已經裝了多少元素。
注意:每個數組中儲存着鏈表 應該 改成每個數組元素存儲着一個鏈表
注意:jdk1.7中HashMap默認采用數組+單鏈表方式存儲元素,當元素出現哈希沖突時,會存儲到該位置的單鏈表中。這和1.8不同,除了數組和單鏈表外,當單鏈表中元素個數超過8個時,會進而轉化為紅黑樹存儲,巧妙地將遍歷元素時時間復雜度從O(n)降低到了O(logn))。
