新手入门关于C#中数据结构的理解

       来上海已经一段时间,感慨颇多,经历几轮的面试慢慢的发现,语言这方面不能以会用为标准,要懂,深入了解。路漫漫其修远兮,吾将上下而求索。

      数据结构在不同的使用者中有着不同理解,但一千个人眼中的哈姆雷特还是那个哈姆雷特。

      数据结构:同一类数据元素中,各个元素之间的关系,包括三个成分,数数据的存储结据的逻辑结构,构和数据的运算结构。顾名思义数据结构将会常与各种算法联系在一起。 下面来看几个基本的常用的数据结构吧

       实际编程中我们常用的数据结构不外乎以下几种:Array、ArraList、List、Queue(堆: 先进先出)、Stack(栈:先进后出)、Dictionart、LinkLedList

        Array 作为C#中最简单基本的数据结构其特点:1、数组中数据存储在连续的内存上。2、存储的数据类型相同。3、通过下标可直接访问。声明一个属数组时,将在堆中分配一段连续的内存来储存数量为n的数据。存储的数据为值类型时,在分配的内存中会有n个未装箱的值类型被创建;存储的数据为引用类型时,在分配的内存中会有n个引用类型的索引被创建。

       优点: 数组在内存上是连续的存储,因此它的索引速度很快,访问其中的一个元素的时间是恒定的,与其的元素数量无关,数组中赋值修改的元素很简单。缺点:1、数组是连续存储,在其俩个元素中插入一个新的元素变得不方便,2在声明数组时,必须制定其长度,就会产生当我们声明的长度过长时浪费内存,当声明的长度过短时,会有溢出的风险。这种随机定义数组长度的不稳定性,严重影响了使用Array的使用频率,针对这种缺点,由此引出ArraList。

     ArrayList针对Array声明时需要指定长度和只能储存相同类型的限制,推出了 ArrayList。ArrayList需要引入System.Collections。

       优点:(1)使用中不用申明其长度,ArrayList是根据其存储的元素长度来动态变化的。(2)ArrayList可以存储不同类型的元素,ArrayList中所有存储的元素都会当做Object来处理,所以能存储不同的元素。缺点:(1)发生装箱和拆箱:由于ArrayList中所有的存储的元素都被当做Object类型来处理,值类型在存储中会转换为引用类型(装箱),读取过程中会再转换为值类型(拆箱),装箱时会生成新的引用类型,有时间消耗,影响效率。(2)ArrayList存储类型是不安全的(原因会在深入了解中解释)。因此在实际操作中考虑到安全和效率ArrayList也是几乎不怎么用,下面综合上面的优点、用的最多的List将会登场。

        List:为了解决ArrayList不安全类型和装箱和拆箱的缺点,出现了集合泛型。List内部是通过Array来实现的(会在List内部构造介绍)。

        优点:(1)保证了存储元素的类型的安全(2)取消了装箱和拆箱,同时也融合了Array的快速访问和ArrayList长度的灵活的优点。

       Queue:这种数据结构中,最先插入的元素是最先被删除(先进先出FIFO ---firist in first out的线性表)通常使用Enqueue和Dequeue这俩个方法实现存取。

      Stack:这种数据结构中,最先插入的元素是最先被删除(先进后出LIFO ---late in first out的线性表)通常使用pop和push这俩个方法实现存取

      Dictionart:提到字典就不能不说Hashtable哈希表和hashing(哈希,又名散列),字典的实现方式就是哈希表的是现实方式。创建一个字典之后,往里面存储、增加、删除、访问都是非常快的,但并不是所有的好事都被字典占了,Dictionary在操作中能快速实现功能,是因为通过更多内存的开销的来满足。在创建字典时,我们可以传入一个容量值,但实际的容量并非该值,字典中而是使用不小于该值的最小质数作为它的实际容量,最小是3。(哈希冲突再说)当有了实际容量,字典并非实现索引,而是通过创建额外的2个数组的来实现间接索引,即int[] buckets和Entry[] entries两个数组(即buckets中保存的其实是entries数组的下标)。我们新建了一个空的字典,那么伴随而来的是2个长度为3的数组。所以当处理的数据不多时,还是慎重使用字典为好。

 

    

 

你可能感兴趣的:(C#语言)