一.創建

這個相信大家也都知道怎么使用,今天就深入理解一下這里的底層原理,
首先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(),進行陣列的擴容,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/393131.html
標籤:java
上一篇:波吉學設計模式——玩轉單例模式
