hashmap知識點簡單彙總

2021-10-17 08:56:51 字數 1735 閱讀 8795

hashmap擴容

hashmap的底層陣列的初始值是16,負載因子是0.75,擴容預設的是16*0.75=12,當要新增的元素如果新增後超過了12就開始擴容(不一定是12,看你new hashmap(int capacity)capacity是幾,一般是12,就先說12吧),擴容是2倍,就是擴容的長度是原來的2倍

1.7的時候hashmap的底層是陣列(桶)+鍊錶,1.8的時候是陣列+鍊錶+紅黑樹

hashmap可以存null,可以存無數null,但是null對應的value值只能是最新的乙個,但是hashtable不行

put方法

因為hashmap的key是不能相同的,如果put()的時候元素的key已經存在,那麼value就用新值代舊值的方法,基本上所有的put方法就是根據這個原則來的

1.7的時候

先根據hash()方法求出要put進去的key的hash值,然後根據hash值與(組桶的長度-1)做取餘運算得到要存放在的桶的位置【實際**是indexfor()方法】,然後開始for迴圈比較這個桶以及這個桶下的鍊錶下是否有值,有值先乙個個比較當前桶下的元素的hash值和要put進去的key的hash值和equals()內容是不是相等,相等的話,把已經存在的key對應的value用新的value代替了,否則,直接新增此元素,如果此桶的位置上沒有元素,那麼也直接新增此元素*****=》新增的時候涉及到擴容,判斷當前put的值之後陣列的size是否超過了閾值的大小,如果超過了,那麼就開始2倍的擴容,讓entry陣列的長度*2,然後重新對要put的值進行rehash(),重新得到hash值,用新得到的hash值與陣列的新長度進行取餘運算,然後對新元素建立entry()物件,使用createentry()進行元素新增新增,最後把size++,即size+1

1.8的時候

因為1.8在new hashmap()的時候沒有對底層的陣列進行初始化,所以在put()元素的時候首先就是判斷node陣列是否為null並且陣列.size=0,如果是的話,對底層node陣列進行resize()初始化,設定集合閾值(擴容的臨界值),集合capacity,負載因子,(一般集合capacity預設設為16,閾值為12,負載因子為0.75)然後進行hash(key)運算,hash運算進行了hash值與hash值右移16位的或運算(避免hash值重複),並且與陣列長度進行取餘運算得到桶位置,如果此桶的位置上沒有元素,直接新增node()節點,否則判斷此桶位置上的元素是不是紅黑樹上的乙個元素,如果是的話,執行新增treenode()節點操作,如果還不是的話,進行for迴圈,判斷此桶位置上的元素的下乙個位置是否有值,沒有值的話,根據當前要新增的元素構造node()節點,然後判斷要新增的元素新增後是否超過閾值-1的值,(**中實際方法是treeifybin())如果超過,開始擴容,如果此桶位置上的下乙個位置上有值,那麼判斷hash值和equals()內容是否相等,相等的話,直接用新值代替舊值

為什麼出現紅黑樹

為什麼負載因子是0.75?

arraylist擴容時預設的容量大小為10,擴容時直接在滿了容量的時候進行擴容,hashmap不是,是在負載因子的作用下,在16*0.75的作用下進行擴容的,不滿的情況下擴容原因是為了減少鍊錶情況的存在,如果負載因子過小,陣列的利用率較低,如果是0.3,則16*0.3=4,在4的時候擴容的話,如果是16*0.9的話,會讓鍊錶產生的過多,所以使用

hashmap知識點小結

1.hashmap是基於hash表的map介面實現 2.hashmap底層採用的是entry陣列和鍊錶實現的 3.hashmap採用鍵值隊 key,value 結構,其中 key不可重複,可以為null,value的值可以重複。4.hashmap為執行緒不安全,無synchronized修飾 5.h...

hashMap關鍵知識點

1 資料結構 jdk1.7是陣列加鍊表,jdk1.8是陣列加鍊表加紅黑樹 鍊錶太長了查詢也慢,所以鍊錶長度超過8時就使用紅黑樹咯 2 hashmap的初始化大小 1 不給長度時,預設初始化為16,建立map時盡量給個長度,防止不斷擴容影響效率。2 大小為2的n次冪時,雜湊得比較均勻,那麼查詢就比較快...

HashMap面試知識點

答案 2個put會同時擴容造成死迴圈 鍊錶有環 可能有2個同時put,導致1個丟失,被後面的put覆蓋了。一種情況是2個執行緒,1存1取,a剛存完key1value1,還沒等b取值,a又存完key1value2,這樣b取值只能取得key1value2,key1value1就丟失了 答案 當hashm...