深入解析HashMap的put方法
一.創建
這個相信大傢也都知道怎麼使用。今天就深入理解一下這裡的底層原理。 首先HashMap在java中,創建出來是一個數組,然後數組上存放的元素是一個鏈表。
二.put()
進入底層源碼看一下。
HashMap,在添加第一個元素的時候創建一個默認2的冪的數組。也就是16,這個參數也可以你自己設置。但是一定是2的冪,假如new HashMap(30),那麼隻會創建一個32大小的數組。
計算出元素的hashcode,放到指定位置,看數組中是否有元素,無元素直接放到數組元素上,有元素的話則進行(jdk1.8)尾插。
當一個數組元素下的鏈表長度超過8,就會觸發treeifyBin(),
但是必須滿足,數組的長度大於64,否則,隻是就行resize()擴容,重新hash。 如果滿足鏈表長度大於8,並且數組長度大於64,此時就把鏈表轉換成紅黑樹(一種比較平衡的二叉搜索樹)。 著裡再講一個設計remove()刪除元素,當紅黑樹裡的元素被刪除到小於8的時候怎麼辦?其實這裡有個過渡,不是8,而是如果紅黑樹裡的元素刪除的小於6的時候就會觸發收縮檢測。
此時就會紅黑樹收縮回鏈表瞭。
三.數組初始化
前面 put裡提到過,初始new HashMap() 默認大小是16,可以指定數組大小,但是一定是2的冪。如 new HashMap(30),那麼數組的大小就為32瞭。這個都很好理解。
四.擴容
負載因子 = 添加的元素 / hash表的長度
這個值默認是 0.75 ( jdk1.8)(可以根據實際需求調整,當值越大hash沖突概率就高,查詢效率低,節省瞭空間,反之相反),當超過0.75,就會觸發resize(),進行數組的擴容。
到此這篇關於深入解析HashMap的put方法的文章就介紹到這瞭,更多相關HashMap put方法內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Java 中 hashCode() 與 equals() 的關系(面試)
- Java必備知識之位運算及常見進制解讀
- Java集合-HashMap
- HashMap在JDK7與JDK8中的實現過程解析
- HashMap底層實現原理詳解