.netFramework List<T>

2021-05-30 20:02

阅读:659

标签:表示   就是   xxxxxx   trim   实现   对象   结果   需要   copy   

List 底层采用数组存值,按照数据查找的话,最坏情况  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

 

.netFramework List

标签:表示   就是   xxxxxx   trim   实现   对象   结果   需要   copy   

原文地址:https://www.cnblogs.com/dzh1990/p/14655548.html


评论


亲,登录后才可以留言!