HashMap 是 Java 中一個非常常用的數(shù)據(jù)結(jié)構(gòu),它基于哈希表實現(xiàn),可以存儲鍵值對。當(dāng) HashMap 中的元素數(shù)量達(dá)到一定程度時,它會自動擴(kuò)容以保持性能。HashMap 的擴(kuò)容機(jī)制主要包括以下幾個步驟:
負(fù)載因子(load factor):HashMap 使用負(fù)載因子來判斷何時進(jìn)行擴(kuò)容。負(fù)載因子是 HashMap 中已存儲元素數(shù)量與底層數(shù)組長度的比值。默認(rèn)情況下,負(fù)載因子為 0.75,即當(dāng) HashMap 中的元素數(shù)量達(dá)到底層數(shù)組長度的 75% 時,就會觸發(fā)擴(kuò)容操作。
擴(kuò)容閾值(resize threshold):當(dāng) HashMap 的元素數(shù)量達(dá)到擴(kuò)容閾值時,就會進(jìn)行擴(kuò)容。擴(kuò)容閾值等于底層數(shù)組長度乘以負(fù)載因子。例如,如果底層數(shù)組長度為 16,負(fù)載因子為 0.75,那么擴(kuò)容閾值為 16 * 0.75 = 12。
擴(kuò)容操作:當(dāng) HashMap 的元素數(shù)量達(dá)到擴(kuò)容閾值時,會進(jìn)行擴(kuò)容操作。擴(kuò)容操作主要包括以下幾個步驟: a. 計算新的底層數(shù)組長度:通常情況下,新的底層數(shù)組長度是原數(shù)組長度的兩倍。這樣可以確保 HashMap 的空間利用率和查詢效率在一定程度上保持平衡。 b. 創(chuàng)建新的底層數(shù)組:根據(jù)新的數(shù)組長度創(chuàng)建一個新的底層數(shù)組。 c. 重新分配元素:遍歷原底層數(shù)組中的所有元素,根據(jù)它們的哈希值重新計算在新數(shù)組中的位置,并將它們放入新數(shù)組的相應(yīng)位置。這個過程可能涉及到鏈表或紅黑樹的調(diào)整。 d. 更新底層數(shù)組和擴(kuò)容閾值:將新的底層數(shù)組設(shè)置為 HashMap 的底層數(shù)組,并更新擴(kuò)容閾值。
容量限制:HashMap 的最大容量受到底層數(shù)組長度的限制。在 Java 中,數(shù)組的最大長度為 Integer.MAX_VALUE(2^31 - 1)。當(dāng) HashMap 的元素數(shù)量接近這個值時,擴(kuò)容操作將無法繼續(xù)進(jìn)行。此時,HashMap 的性能可能會受到影響。
總之,HashMap 的擴(kuò)容機(jī)制通過動態(tài)調(diào)整底層數(shù)組的大小來保持其空間利用率和查詢效率在一定程度上保持平衡。當(dāng) HashMap 中的元素數(shù)量達(dá)到一定程度時,它會自動擴(kuò)容以避免性能下降。