Go Slice的底層自動擴容

2022-01-30 12:29:37 字數 1159 閱讀 4454

go語言聖經中的解釋:

陣列和slice之間有著緊密的聯絡。

乙個slice是乙個輕量級的資料結構,提供了訪問陣列子串行(或者全部)元素的功能,而且slice的底層確實引用乙個陣列物件。

乙個slice由三個部分構成:指標、長度和容量。

指標指向第乙個slice元素對應的底層陣列元素的位址,要注意的是slice的第乙個元素並不一定就是陣列的第乙個元素。

長度對應slice中元素的數目;長度不能超過容量

容量一般是從slice的開始位置到底層資料的結尾位置。內建的len和cap函式分別返回slice的長度和容量。

make(t, len, cap)    len<=cap

在底層,make建立了乙個匿名的陣列變數,然後返回乙個slice

slice只引用了底層陣列的前len個元素,但是容量將包含整個的陣列。額外的元素是留給未來的增長用的

從下面這個自定義函式裡可以了解擴容機制:

else

z = make(int

, zlen, zcap)

copy(z, x)

//把舊的slice複製到新的slice

} z[len(x)] =y

returnz}

通過在每次擴充套件陣列時直接將長度翻倍從而避免了多次記憶體分配,也確保了新增單個元素操的平均時間是乙個常數時間

func main() 

}每一次容量的變化都會導致重新分配記憶體和copy操作,當容量不夠的時候,會有乙個翻倍擴充

0 cap=1 [0

]1 cap=2 [01]

2 cap=4 [012

]3 cap=4 [012

3]4 cap=8 [012

34]5 cap=8 [012

345]

6 cap=8 [012

3456

]7 cap=8 [012

3456

7]8 cap=16 [012

3456

78]9 cap=16 [012

3456

789]

向切片新增乙個元素時,若該切片容量已滿,會首先根據切片容量進行判斷,小於1024位元組擴容為原有容量的2倍,大於1024位元組擴容為原有容量的1.25倍

Go Slice的底層自動擴容

go語言聖經中的解釋 陣列和slice之間有著緊密的聯絡。乙個slice是乙個輕量級的資料結構,提供了訪問陣列子串行 或者全部 元素的功能,而且slice的底層確實引用乙個陣列物件。乙個slice由三個部分構成 指標 長度和容量。指標指向第乙個slice元素對應的底層陣列元素的位址,要注意的是sli...

HashMap的底層原理及擴容過程

initialcapacity 預設初始容量 值為16,最大容量值為2 30 loadfactor 預設載入因子 值為0.75f threshold 閾值 預設值為16 0.75 即容量 載入因子這兩個引數是影響hashmap效能的重要引數,其中容量表示雜湊表中桶的數量,初始容量是建立雜湊表時的容量...

HashMap底層實現原理 擴容機制

hashmap基於map介面實現,元素以鍵值對的方式儲存,並且允許使用null 建和null 值,因為key不允許重複,因此只能有乙個鍵為null,另外hashmap不能保證放入元素的順序,它是無序的,和放入的順序並不能相同。hashmap的容量,預設是16 the default initial ...