C#的数据结构

来源:互联网 发布:建站平台系统源码 编辑:程序博客网 时间:2024/06/05 11:56
 几种常见的数据结构 

这里主要总结下小匹夫在工作中常碰到的几种数据结构:Array,ArrayList,List<T>,LinkedList<T>,Queue<T>,Stack<T>,Dictionary<K,T>


1:数组Array:  
数组是最简单的数据结构。其具有如下特点:

  • 数组存储在连续的内存上。
  • 数组的内容都是相同类型。
  • 数组可以直接通过下标访问。
   优点:创建一个新的数组时将在 CLR 托管堆中分配一块连续的内存空间,来盛放数量为size,类型为所声明类型的数组元素。如果类型为值类型,则将会有size个未装箱的该类型的值被创建。如果类型为引用类型,则将会有size个相应类型的引用被创建。
  由于是在连续内存上存储的,所以它的索引速度非常快,访问一个元素的时间是恒定的也就是说与数组的元素数量无关,而且赋值与修改元素也很简单

      缺点:由于是连续存储,所以在两个元素之间插入新的元素就变得不方便。而且就像上面的代码所显示的那样,声明一个新的数组时,必须指定其长度,这就会存在一个潜在的问题,那就是当我们声明的长度过长时,显然会浪费内存,当我们声明长度过短的时候,则面临这溢出的风险

2:ArrayList

     为了解决数组创建时必须指定长度以及只能存放相同类型的缺点而推出的数据结构。ArrayList是System.Collections命名空间下的一部分,所以若要使用则必须引入System.Collections 

      优点:

    不必在声明ArrayList时指定它的长度,这是由于ArrayList对象的长度是按照其中存储的数据来动态增长与缩减的。ArrayList可以存储不同类型的元素。这是由于ArrayList会把它的元素都当做Object来处理。因而,加入不同类型的元素是允许

    缺点:

  • ArrayList不是类型安全的。因为把不同的类型都当做Object来做处理,很有可能会在使用ArrayList时发生类型不匹配的情况。
  • 如上文所诉,数组存储值类型时并未发生装箱,但是ArrayList由于把所有类型都当做了Object,所以不可避免的当插入值类型会发生装箱操作,在索引取值时会发生拆箱操作

 3:List<T>泛型List 

     即确保了类型安全

    也取消了装箱和拆箱的操作。

    它融合了Array可以快速访问的优点以及ArrayList长度可以灵活变化的优点

4:LinkedList<T> 

    优点:

         向链表中插入或删除节点无需调整结构的容量。因为本身不是连续存储而是靠各对象的指针所决定,所以添加元素和删除元素都   要比数组要有优势。

         链表适合在需要有序的排序的情境下增加新的元素,这里还拿数组做对比,例如要在数组中间某个位置增加新的元素,则可能需要移动移动很多元素,而对于链表而言可能只是若干元素的指向发生变化而已。

     缺点

    由于其在内存空间中不一定是连续排列,所以访问时候无法利用下标,而是必须从头结点开始,逐次遍历下一个节点直到寻找到目标。所以当需要快速访问对象时,数组无疑更有优势

5:Queue<T> 

    

  • 先进先出的情景。
  • 默认情况下,Queue<T>的初始容量为32, 增长因子为2.0。
  • 当使用Enqueue时,会判断队列的长度是否足够,若不足,则依据增长因子来增加容量,例如当为初始的2.0时,则队列容量增长2倍。

6:Dictionary<K,T>

7:Stack<T>

     

  • 后进先出的情景。
  • 默认容量为10。
  • 使用pop和push来操作。

    

原创粉丝点击