做視頻網(wǎng)站 買帶寬谷歌廣告聯(lián)盟一個(gè)月能賺多少
1.底層實(shí)現(xiàn)
2.如何解決hash沖突
3.擴(kuò)容機(jī)制
4.無序
5.非線程安全
6.不可尋址
runtime/map.go
1.底層實(shí)現(xiàn)
底層基于hash表實(shí)現(xiàn),實(shí)現(xiàn)有2個(gè)結(jié)構(gòu)體hmap,bmap,map由若干個(gè)桶存儲,每個(gè)桶存8個(gè)元素,使用鏈地址解決hash沖突
2.如何解決hash沖突
鏈地址法
當(dāng)key定位到的桶已經(jīng)填滿8個(gè)元素,會創(chuàng)建一個(gè)溢出桶,將溢出桶插入當(dāng)前桶的鏈表尾部
3.擴(kuò)容機(jī)制
擴(kuò)容條件
1.超過負(fù)載
map元素個(gè)數(shù) > 6.5*桶個(gè)數(shù),即平均每個(gè)bucket存儲的鍵值對達(dá)到6.5個(gè)
2.溢出桶太多
沒有超過負(fù)載因子,但是溢出桶太多
當(dāng)桶總數(shù) < 2^15, 如果溢出桶總數(shù)>=桶總數(shù),則認(rèn)為溢出桶過多
當(dāng)桶總數(shù)>=2^15 如果溢出桶總數(shù)>=2^15 ,則認(rèn)為溢出桶過多
擴(kuò)容機(jī)制:
1.雙倍擴(kuò)容
新建一個(gè)桶數(shù)組,個(gè)數(shù)是原來的2倍,然后把舊桶的數(shù)據(jù)遷移到新桶
2.等量擴(kuò)容
并不擴(kuò)大容量,桶的數(shù)量保持不變,只是把舊桶的數(shù)據(jù)重新排列一次,使得同個(gè)桶的key排列更緊密,節(jié)省空間。
4.無序
(1)map在遍歷時(shí),不是固定從0號桶開始遍歷,每次遍歷都會隨機(jī)選一個(gè)桶
(2)map擴(kuò)容會發(fā)生key遷移,導(dǎo)致順序變化
如何保證有序,先對key排序,再按key遍歷map
5.非線程安全
沒有加鎖
6.不可尋址
map的value不可尋址原因
1.map底層是基于哈希表實(shí)現(xiàn),也就是數(shù)組+鏈表,本身不可尋址
2.map擴(kuò)容會導(dǎo)致key,value發(fā)生遷移