.NET源码分析之List

.NET源码分析之List,第1张

List类图

 

上图展示了LIst的继承和实现关系。

构造函数

List构造函数一共有3个,

1、无参构造,创建的集合是一个空数组

2、带集合大小的构造,如果传入的是有效的集合大小,则创建对应大小的数组。

3、实现了IEnumerable类型的构造,将传入的数据copy到新的数组中去。

PS:List底层的实现是通过Array数组来实现的(private T[] _items)。

 

Count:这个属性最常用,指的是当前集合中元素的数量。

Capacity:这个属性代表了当前集合所使用数组的容量,上面也提示过了,List的底层是数组,数组在声明的时候是需要有一个固定长度的,Capacity指的就是数组的长度,Capacity的值一定是大于等于Count。

方法

Add和Insert类方法

往集合中添加数据,最终是往数组_items中增加数据

下图展示的是Add方法的源码,从源码中可以看到

刚初始化的空集合第一次添加数据时,默认设置数组的长度_defaultCapacity为4,当给集合添加第5个元素时,底层实现数组则是创建一个新数组,新数组的长度是当前数组的2倍,然后将当前数组的数据拷贝到新数组中,最后将第5个新元素加入数组中;

 

 

 

 

 Find类方法

从源码中可以看到Find方法的根子是使用for循环来实现的,传入的是lambda表达式进行对比。

 

 

 

 

 

 Indexof类方法

indexof类方法调用的是Array数组的indexof方法,最终使用for循环进行查找下标。

Remove方法

remove方法实现是使用数组的copy来实现的,比如当前集合5个元素,要移除第3个元素,实际结果是将数组的第4个元素到最后一个元素拷贝然后粘贴替换到数组的从第3个元素开始,这样就把第三个元素给替换掉了,然后再把数组的最后一个元素给置为默认。

 

 RemoveAll方法

removeAll方法实现如下图所示,是先将所有符合移除条件的元素通过前后位置交换的方式,全部替换到数组的尾部,这样需要移除的元素都是在一起并且是在数组的尾部,然后再通过Array的clear方法,将尾部的元素全部移除。

 

.NET源码分析之List

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/zaji/1006846.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存