1.首先明确List的底层是用数组实现的,并且可以动态扩容,默认容量大小为4。每次增加一个元素的数据,Add接口都会首先检查的是容量还够不够。每次容量不够的时候,整个数组的容量都会扩充一倍,_defaultCapacity 是容量的默认值为4。因此整个扩充的路线为4,8,16,32,64,128,256,512,1024…依次类推。
List使用数组形式作为底层数据结构,好处是使用索引方式提取元素很快,但在扩容的时候就会很糟糕,每次new数组都会造成内存垃圾,这给垃圾回收GC带来了很多负担。
2.List在Add,Remove的时候都是采用数组的拷贝,用Array.Copy对原先的数组进行覆盖
3.Enumerator 每次都是被new出来,如果大量使用迭代器的话,比如foreach就会造成大量的垃圾对象,尽量不要用foreach,因为 List 的 foreach 会增加有新的 Enumerator 实例,最后由GC垃圾回收掉。
4.List.Sort,采用的快速排序方式
5.List的内存分配方式不合理,当List里的元素增加时,会重新new数组,原来的数组被无情地抛弃,会给垃圾回收造成压力,优化的方式就是提前定义好List的容量大小。