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 兼容性强,但效率并不高。