C# 之List底层源码解析

 

构造函数:

由此可见 List 用数组实现的

 

 

Add 方法:

 

 

 

 

我们来继续看下EnsureCapacity 函数:

 

 


 

 

Remove 方法: 

 

 

 

 

 

 

 

 Remove:使用Array.IndexOf ()  获取Item 的索引,然后用RemoveAt 来移除,RemoveAt里面用的是 Array.Copy 来拷贝数组,从index处之后的元素往前移一位。时间复杂度为O(n)线性时间。

 

Insert 方法:

 

 
Clear 和 Contains  方法:

 

 

ToArray 方法:

 

Sort 方法:

 

 

 

 

Array.Sort 排序算法:

 

 时间复杂度为O(n logn)快速排序

 

简单总结下:

List 源码用数组实现的,常用接口的时间复杂度为线性时间,多次元素增加,扩容方式为2的指数,如果元素数量有65个,则扩容(64*2)128,造成大量的内存空间的浪费。

没有对多线程做任何的加锁安全处理,无法处理并发情况下_size++ 的执行顺序,因此在多线程使用的时候 要进行加锁等安全处理操作。List 兼容性强,但效率并不高。

 

posted @ 2022-05-04 17:49  赵不灰  阅读(1515)  评论(0编辑  收藏  举报