深入解析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!

推薦閱讀: