java HashMap 有獨特的設計。
哈希表數組的每個位置是一個哈希桶,里面由鏈表或紅黑樹實現。(> 8 或 < 6 的變化時,避免頻繁切換)
-
容量(capacity): 哈希表中桶(bucket)的數量,默認初始容量為 16
-
負載因子(load factor): 衡量哈希表多滿時進行擴容的指標,默認值為 0.75。
擴容是2倍。
高效哈希
以 HashMap 的哈希方式,擴容只需要挪動一半的數據。
在 Java 的 HashMap 中,哈希桶的索引是通過**目標值 與運算(哈希表大小-1)**計算 (這里的 n 是當前哈希表的容量,2的冪,n-1就是全1)。
當進行擴容時,容量 n 變為原來的 2 倍,新的索引計算方式變為 (2n - 1) & hash。擴容后只多一個 1 位。
那我們再次進行與操作,最高位要么是1,要么是0.
- 通過高位掩碼拆分,元素更均勻分布到新桶中,降低后續操作的沖突概率。
- 利用位運算直接確定新位置,無需重新計算哈希值,減少了計算開銷。