zoukankan      html  css  js  c++  java
  • .netFramework List<T>

    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

  • 相关阅读:
    🔨FFmpeg 转换至 MP4 视频格式
    🔨Ubuntu Linux '门' '复' 显示不标准
    🔨Youtube-dl 开代理搭配 Aria2 多线程加速下载
    📔 如何用英语的思维来思考 How to THINK in English
    🚀 sublime 加速软件下载
    🚀 snap 代理
    🚀 Chocolatey 代理
    🔨 Deepin V20 软件及遇到的问题
    💿 npm 换源 (转载)
    🔨FFmpeg 合并视频
  • 原文地址:https://www.cnblogs.com/dzh1990/p/14655548.html
Copyright © 2011-2022 走看看