面試筆記 HashMap擴容機制

2022-01-20 13:41:16 字數 1305 閱讀 2275

擴容必須滿足兩個條件:

1、 存放新值的時候當前已有元素的個數必須大於等於閾值

2、 存放新值的時候當前存放資料發生hash碰撞(當前key計算的hash值換算出來的陣列下標位置已經存在值)

如果需要擴容,呼叫擴容的方法resize()

void resize(int

newcapacity)

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, boolean

rehash)

//通過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...