自学内容网 自学内容网

【Unity C#基础】Dictionary字典底层逻辑

一、底层实现

以数组为底层逻辑。

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……的速度二倍多递增,删除时不缩减内存。


原文地址:https://blog.csdn.net/boyZhenGui/article/details/140497017

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!