map底層的一些理解

Iwanna發表於2020-09-25

Draven的部落格 以及 此文 感覺瞭解了不少golang對map底層的一些實現,特此記錄

底層結構

map的底層在絕大多數語言裡面都是使用的陣列加連結串列實現的,go也一樣

hash衝突的解決

其實map底層的連結串列本身就是為了解決hash衝突,每個連結串列裡面最多放8個元素,滿了就放到溢位桶裡面去

擴容產生條件

  1. 裝載因子超過 6.5

    裝載因子 = map的元素個數/桶個數

  2. 溢位桶過多(大於 1<<(B&15))

    B是用來計算桶個數的,桶個數=2^B
    因為和15做了&運算,所以溢位桶數量永遠不會超過31個
    這個條件是golang發展一段時間後才加上的

擴容時的操作

map擴容後需要重新計算元素屬於哪個新桶,這裡注意,從舊桶遷移到新桶是慢慢進行的,不是一步到位

當進行寫操作(增刪改)時會觸發nevacuate舊桶元素的重分配,若本身操作的就是舊桶中的元素,就會同時額外觸發一箇舊桶的遷移(即一次遷移兩個),直至全部桶內元素遷移完成後,會把oldbuckets重置為nil

最後

感謝Wbofeng大晚上陪我讀原始碼

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章