c# 容器-底层实现

c#的源码放在这里了 c#源码
不懂的地方就去多扒拉源码吧,反正我是好多都看不懂,只能看懂一点点,慢慢学吧!

list

Add 初始容量为0 然后为4 内存不够的时候2倍扩容,这一点和c++vector有点像,所以初始化的时候推荐申请足够大的内存
c# 容器-底层实现_第1张图片

Insert 吧index后面的元素后移,在index位置插入新元素
c# 容器-底层实现_第2张图片

Remove 其实底层先遍历在调用的RemoveAt
c# 容器-底层实现_第3张图片
RemoveAt的底层其实把后面的元素向前移动,真的不清楚这样的话性能到底怎么样,估计应该不好
c# 容器-底层实现_第4张图片

ArrayList

这玩意可以添加任意的类型,其实内部的存储都是Object类型的,需要进行装箱和拆箱的操作,虽然它很银杏,但是非常的耗时啊,
c# 容器-底层实现_第5张图片
内存的扩展机制和List一样,删除也差不多,都是需要移动的,没啥可说的~
c# 容器-底层实现_第6张图片

LinkedList

这玩意就是个双向链表,双向链表大家应该都写过

HashSet

可以理解为集合吧,底层是hash表,而c++的集合底层是红黑树

欲与千言,竟又无语凝噎 实在不知道说什么好,也不知道是不是我看的不透彻,反正就是不知道写点啥好,源码发出来了,自己看去吧

HashTable与Dictionary

他俩的区别就像 ArrayList 和 List 的区别

hasttable是的key和value是不需要在定义的时候指定类型的,键值可以是任意类型并且支持字符串的大小写,因为他们存储的都是object类型,并且支持单线程写入多线程读取

Dictionary是需要指定键值类型的hashtable,Dictionary 非线程安全,

两者的底层都是hash表实现的

hashtable的内部一个buckets数组,用来存储键值,数组的下标通过key用hash算法得到,
c# 容器-底层实现_第7张图片

hashtable的扩容:
以最接近当前表长度2倍的素数做为新的hash表的长度
c# 容器-底层实现_第8张图片

关于dictionary的讲解这篇博客比我讲的要好多了,大家可以看一看具体的实现过程
点这里

Stack与Queue

stack存储的是object类型,stack指定存储类型

栈的初始容量是10,如果指定的容量小于10也是默认10
c# 容器-底层实现_第9张图片
扩容也是2倍
c# 容器-底层实现_第10张图片
队列的话默认初始大小为32,默认2.0倍扩增,这些也可以指定
c# 容器-底层实现_第11张图片

你可能感兴趣的:(c#)