因爲HashMap的容量是有限的,若是HashMap中的數組的容量很小,假如只有2個,那麼若是要放進10個keys的話,碰撞就會很是頻繁,此時一個O(1)的查找算法,就變成了鏈表遍歷,性能變成了O(n),這是Hash表的缺陷。算法
爲了解決這個問題,HashMap設計了一個閾值,其值爲容量的0.75,當HashMap所用容量超過了閾值後,就會自動擴充其容量。數組
在多線程的狀況下,當從新調整HashMap大小的時候,就會存在條件競爭,由於若是兩個線程都發現HashMap須要從新調整大小了,它們會同時試着調整大小。在調整大小的過程當中,存儲在鏈表中的元素的次序會反過來,由於移動到新的bucket位置的時候,HashMap並不會將元素放在鏈表的尾部,而是放在頭部,這是爲了不尾部遍歷。若是條件競爭發生了,那麼就會產生死循環了。多線程