Map

1.数据结构&内存分布

structure

###2.算法实现

#1 m[key]: 访问元素(mapaccess)

首先hash值的计算是根据key的类型使用不同的算法计算出来的,返回值为uintptr

其次,低位确定所在bucket链(可能已经overflow)

最后,计算高位hash,遍历bucket链的tophash数组,定位key所在的可能的bmap,最终通过比较原始hash是否相等来判断是否为要查找的key;

如果key被找到(且在tophash数组的第i个),则可以计算出value的地址为:

如果key没有被找到,返回空值(特殊值):

 

#2 map[key] = v:更新/插入元素(mapassign)

首先,计算key的hash以及高低位hash,如果key已经存在则进行更新,否则尝试新增key/val pair

在新增之前,判断是否达到触发(buckets)扩容:

扩容之后,有两种情况,使用现有bucket或者新增overflow,如果需要新增overflow,新增的key默认放在tophash[0];

最后,完成tophash,key的赋值,返回分配给存储val的地址;

 

#3 delete(map,key):删除元素(mapdelete)

首先,依旧是计算hash,查找对应的key,如果存在则进行以下步骤;

清空对应的key/val字段,设置tophash为emptyOne,

特殊的,如果当前i之后(包括overflow)的tophash值都为emptyRest,则设置当前tophash值为emptyRest;

减少查找比较次数

 

3.设计要点

1.hash值分段,将key分组,减少查找的比较次数

1.只要map的key/value类型确定,在同一个bucket中定位key/value所在的位置是相当快的

2.动态扩容,增量复制

3.标记删除