一、底层实现
以数组为底层逻辑。
Key与Value通过Hash函数进行关联。
Hash函数最简单的算法为取余操作,例如当Key为85时,源码为:
hash_key = Key % 30 = 25
Dictionary使用链表数组来存放Hash值,来避免Hash冲突(两个不同的Key的Hash值相同),也就是拉链法。
添加Key值时,将新值添加到对应标号的链表后边。
查找也是在对应表好的链表中查找。
二、容量
new Dictionary时,如未指定大小,则默认数组容量和List一样,也是0。
Dictionary算法中,有一个质数数组{3,7,11,17,23,29,37,47,59,71,89……},
如果创建时制定了数组大小n,则在质数数组中,查找大于n的最小值,作为数组大小。
扩容时也是同理,原来size先扩大2倍,然后在质数数组中,查找比结果大的最小值作为新的容量大小。
三、Add与Remove
Add:获得Hash值后,可以知道应该把新值放在哪个数组元素上,如果该元素不为空,则需要将新值放到该链表的尾部。
Remove:找到对应Hash值的元素,将其置空,不会删除内存。
四、总结
Dictionary不是线程安全的,多线程中需要自己写lock。
Dictionary由数组构成,通过Hash函数完成地址构建,通过拉链法解决Hash冲突。
内存上大小以3-7-17-37……的速度二倍多递增,删除时不缩减内存。