擴容必須滿足兩個條件:
1、 存放新值的時候當前已有元素的個數必須大於等於閾值
2、 存放新值的時候當前存放資料發生hash碰撞(當前key計算的hash值換算出來的陣列下標位置已經存在值)
如果需要擴容,呼叫擴容的方法resize()
void resize(intnewcapacity)
entry newtable = new
entry[newcapacity];
//transfer()方法把原陣列中的值放到新陣列中
transfer(newtable, inithashseedasneeded(newcapacity));
//設定hashmap擴容後為新的陣列引用
table =newtable;
//設定hashmap擴容新的閾值
threshold = (int)math.min(newcapacity * loadfactor, maximum_capacity + 1);
}
transfer()在實際擴容時候把原來陣列中的元素放入新的陣列中
void transfer(entry newtable, booleanrehash)
//通過key值的hash值和新陣列的大小算出在當前陣列中的存放位置
int i =indexfor(e.hash, newcapacity);
e.next =newtable[i];
newtable[i] =e;
e =next;}}
}
hashmap的擴容需要滿足兩個條件:當前資料儲存的數量(即size())大小必須大於等於閾值;當前加入的資料是否發生了hash衝突。
因為上面這兩個條件,所以存在下面這些情況
(1)、就是hashmap在存值的時候(預設大小為16,負載因子0.75,閾值12),可能達到最後存滿16個值的時候,再存入第17個值才會發生擴容現象,因為前16個值,每個值在底層陣列中分別佔據乙個位置,並沒有發生hash碰撞。
(2)、當然也有可能儲存更多值(超多16個值,最多可以存26個值)都還沒有擴容。原理:前11個值全部hash碰撞,存到陣列的同乙個位置(這時元素個數小於閾值12,不會擴容),後面所有存入的15個值全部分散到陣列剩下的15個位置(這時元素個數大於等於閾值,但是每次存入的元素並沒有發生hash碰撞,所以不會擴容),前面11+15=26,所以在存入第27個值的時候才同時滿足上面兩個條件,這時候才會發生擴容現象。
面試題 HashMap擴容機制
擴容機制 1.什麼時候才需要擴容 2.hashmap的擴容是什麼 進行擴容,會伴隨著一次重新hash分配,並且會遍歷hash表中所有的元素,是非常耗時的。在編寫程式中,要盡量避免resize。hashmap在進行擴容時,使用的rehash方式非常巧妙,因為每次擴容都是翻倍,與原來計算的 n 1 ha...
hashMap擴容機制
擴容時空間大小變化 hashmap中,雜湊桶陣列table的長度length大小必須為2的n次方 一定是合數 這是一種非常規的設計,常規的設計是把桶的大小設計為素數。相對來說素數導致衝突的概率要小於合數,具體證明可以參考 hashtable初始化桶大小為11,就是桶大小設計為素數的應用 hashta...
HashMap擴容機制
當map元素容量超過設定的閾值threshold capacity loadfactor時進行擴容,如下圖所示 原理 建立更大容量的新陣列,重新計算每個元素在新陣列中的位置進行遷移。缺點 每個元素需要重新計算hash 鍊錶中元素順序每次遷移後被倒置 原理 在擴充hashmap的時候,不需要像jdk1...