Kevin-moon

学习在于分享
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

浅谈NET的数据结构---列表结构

Posted on 2008-09-11 15:48  Kevin-moon  阅读(683)  评论(2编辑  收藏  举报

     前段时间在做一个老项目的代码重构和优化,发现很多的问题,之一就是数据结构的乱用.单一这点就造成了大量的性能消耗.不禁感叹,"为什么不在用之前先去了解呢?",MS对常用的数据结构封装的很好,简单,易用.但是它们之间也有些不同的,我们不应该只关注如何使用它们,也要关注它们之间的差异,这样才能正确使用.
所以想和大家谈谈它们之间的不同.
     数组array是数据的无序集合,对于它的创建需要预先给出一定的内存空间,它并不支持在原有的内存空间的基础上去扩展.同时也不能内存进行清理,array中提供的clear不过是只把值清空而已,对内存不做任何动作.
     ArrayList,List<T>,SortedList<T,K>,Stack<T>,Queue<T>...这些列表结构都是采用数组作为基础的,所以他们的操作都是在操作数组,都必须满足数组array的操作规则.但是你也许会有疑问,"它们都可以动态去扩展元素,提供了很多方法,既然数组Array不支持,那它们是怎么去实现的呢?"
这些列表结构动态去添加元素都是按照下面规则去实现的:

Code


     这就有个缓冲区扩容的问题,当数据量大的时候会造成大量的内存浪费.不过它们都提供了一个TrimExcess,用于清理没必要的内容,将容量设定为实际容量.同时有个需要特别注意的地方:在List<T>都有个InsertRange(int index,IEnumerable<T> collection
)方法,用它的时候,collection最好是继承与ICollection的,这样性能是最好的,因为它是采用Array的一次Copy实现,然而如果它只是从IEnumerable上继承的话,它就相当与foreach地调用Insert方法.
     再说查找,Stack,Queue这两个,根据就不涉及查找的问题,因为根据就没有提供.List<T>和ArrayList都提供了线性查找和二分法查找(BinarySearch),至于SortedList,它里面的比较和查找都是二分法查找.
     最后要说的是线程安全的问题,这些列表结构都是线程不安全的,除了ArrayList提供了Synchronized来获取线程安全的列表外,其他列表结构都没有提高,所以如果有这个需求就要自己去实现了.