List<T> 底层采用数组存值,按照数据查找的话,最坏情况 O(n),如果按照下标查找的话O(1)
例:T[0]直接可以得到值
数组长度和list数关系
假设数组的长度是32 list是32
这种情况是良好的 数组长度够用
但此时如果add一个list,数组长度就需要扩容,扩容 至少是原来的2倍
变成 长度是64 这个64的数组是一个完全新的数组,也就是说原来的32长度的数组,需要等待GC去回收
旧的32数组会执行Array.Copy命令将数据拷贝到新的64数组上
所以说
使用list如果遇到扩容情况,可能造成内存的浪费 (33个list 需要64长度数组 31个长度的浪费)
copy操作很耗时,如果大量使用list可能造成程序反映慢的情况
对于内存的浪费, List 中有TrimExcess()方法
(将数组长度*0.9和list数比较 结果大于list数的话,就将数组长度变为list数)
对于list.add 和list.addrange 添加多个时 list.add 需要for去一个个add addrange中如果对象实现来icollection 接口的话
整体的消耗要远远小于for 去一个个add
对于list.removeat,list.removerange和list.removeall来说
删除多个对象时 removerange 的消耗要小于removeat,
removeall的实现和removerange,removeat的实现是不同的
removerange,removeat 是用Array.copy 去将remove的数据移除,后面的数据放到移除的位置,最后剩下的设置成default (删除时数组的长度不会发生变化,节省内存要调用TrimExcess()方法)
而removeall 举个例子 x表示删除o表示正常
00xxxx000xx00
做法
000xxxx00xx00
0000xxxx0xx00
00000xxxxxx00
000000xxxxxx0
0000000xxxxxx
最后将xxxxxx设置成default 没有用到copy只是赋值所以能用removeall就用removeall