Go的深度地圖使用和實現原理
go中的Map也是壹個hashmap,由壹個桶數組組成。每個存儲桶可以存儲幾個元素(默認為8個)。當元素多於8個時,hmap會使用overflow in extra指向壹個新的桶來擴展這個桶。
桶數組到哈希數組數據字節數組溢出鏈表
哈希沖突後的數據結構:
溢出就是溢出的意思。
加載因子用於指示哈希沖突的情況=鍵的數量/桶的數量。
哈希因子需要控制在合適的大小,超過閾值後需要重新哈希。
*哈希因子太小,表明空間利用率低。
*哈希因子過大,說明沖突嚴重,訪問效率低。
每個哈希表的實現對負載因子有不同的容忍度。當redis中的load factor為1時,會觸發rehash,因為redis的每個桶只能存儲壹個鍵值對。Go可以存儲8,裝載系數6.5;
4.1擴容的先決條件
為了保證訪問效率,當增加壹個新元素時,會檢查是否需要擴展,擴展其實就是空間換時間;
4.2增量擴容
在負載系數超過閾值後,建立壹個新桶,其長度是原來的兩倍,並將舊桶的數量逐漸移至新桶。
如果數據量大,會采用漸進式hash,每次訪問map都會觸發壹次重定位,每次兩個鍵值對,oldbuckets將在重定位完成後被刪除;
4.3收縮能力
通過連續刪除;鍵值對集中在少數存儲桶中;並且大部分溢出是空的;重組後;桶的數量將會減少;從而提高訪問效率。