Java中的哈希表是通過HashMap類實現的。HashMap是基于哈希表的Map接口實現,它允許使用null值和null鍵。HashMap的擴容機制是在put()方法中實現的。
當向HashMap中添加元素時,首先會計算鍵的哈希值,然后根據哈希值找到對應的桶。如果該桶已經存在元素,那么會將新元素添加到鏈表或紅黑樹中。如果該桶為空,那么直接將元素添加到桶中。
在添加元素的過程中,HashMap會檢查當前元素數量是否超過了閾值(容量 * 負載因子)。如果超過了閾值,那么就會觸發擴容操作。擴容操作主要包括以下幾個步驟:
計算新的容量:通常情況下,新的容量是原容量的兩倍。如果原容量已經達到了最大容量(2^30),那么新的容量將保持不變。
創建新的桶數組:根據新的容量創建一個新的桶數組。
重新分配元素:遍歷原桶數組,將每個桶中的元素重新計算哈希值,并放入新的桶數組中。這個過程可能會導致元素在新的桶數組中的位置發生變化。
更新容量和閾值:將新的容量和閾值更新到HashMap中。
需要注意的是,擴容操作是一個相對昂貴的操作,因為它涉及到重新分配元素和創建新的桶數組。因此,在使用HashMap時,應盡量避免頻繁的擴容操作。可以通過設置合適的初始容量和負載因子來優化HashMap的性能。