C#数据类型

数组Array:

数组是最简单的数据结构其特点为:
  1. 数组存储在连续的内存上。
  2. 数组的内容都是相同类型。
  3. 数组可以直接通过索引访问。

优点:
  连续内存上的存储,通过索引获取和修改元素非常快,其访问速度是恒定于数组元素长度无关。
缺点:
  1. 声明需要指定长度。
  2. 由于是连续存储并且指定长度,所以在插入元素上有很大的隐患。

列表ArrayList:

列表是数组的升级版,其特点为:
  1. ArrayList的长度是自增的,所以没有主观意义上的长度定义。
  2. ArrayList可以存储不同类型的数据,存入其中的内容都转为Object类型处理。
优点:
  1. 不用考虑类似数组长度所带来的拓展性问题
  2. 可以存储不同类型的数据
缺点:
  1. 长度的自增并没有想象中那么完美,具体原来在泛型列表内我们详细说道。
  2. 因为存储数据都转为Object类型,其数据的存入取出存在装箱拆箱风险。
  3. 频繁的结构中间插入删除操作具体请看泛型

泛型列表List

泛型列表(以下简称泛型)是ArrayList的升级版,其特点为
  1. 在列表的基础增加类型约束。
  2. 具有同ArrayList一样的长度自增。
实现原理:
  列表内部维护一个T类型数组,该数组初始值为4,每次超出初始值时,c#会重新创建一个新数组,数组长度 = 原数组长度 * 2 ,该数组将替换原数组
优点:
  1. 包含数组的特点(因为其内部就是维护一个数组),同时其内容存储为单一类型数据,防止装箱拆箱风险
  2. 具有同ArrayList一样的长度自增。
缺点:
  1. 长度自增所带来的内存空间申请问题,查看泛型源码时可以发现,自增长度的空间时在其维护的数组长度 *2 ,也就以为着当我们有6000条数据时,其维护的数组只有5999长度时,泛型会将其维护数组的长度拓展到11998,在更大的数据来临,其空余的长度会越来越大,泛型提供了其定义初始化长度变量Capacity,我们最好能够定义数组的时候就定义一个符合应用的初始长度值,来协助泛型帮助我们进行更好管理。
  2.频繁的结构中间插入删除操作会移动该索引后方所有数据,如果数据需要频繁的造作中间数据时,建议使用链表

字典Dictionary

字典以键值对类型存储,学名为哈希散链表,是哈希表的升级版(哈希表的定义就不写了,跟ArrayList与泛型列表的区别差不多),其特点为:
  1. 内部维护两个列表用于键值对的查找
  2. 具有同列表一样的长度自增
实现原理:
  1. entry结构体 包含哈希值,下个连接索引,key,value
  2. entries[entry] 包含多个entry结构体的数组
  3. Buckets[int] 哈希桶 用于散列哈希值,该索引会连接到对应哈希值的最后一个节点
优点:
  1. 键值对查找,在进行键值查找时耗时极小,赋值方便
  2. 长度自增相对方便
缺点
  1. 典型的空间换性能,除了key,value,还会保存哈希值和维护哈希桶,在存储大量数据的时候会增加内存。
  2. 长度自增问题,容量的分布可以参照HashHelpers.primes,在创建字典时,我们可以传入一个容量值,但实际使用的容量并非该值。而是使用“不小于该值的最小质数来作为它使用的实际容量,最小是3。”造成空间浪费

队列Queue

队列包含其特点:
  1. 如同排队一般,先进先出(FIFO),适用于服务器排队等功能
  2. 通过使用Enqueue和Dequeue这两个方法来实现对 Queue 的存取。
  3. 存取操作时绝对的,存取后数据将会从队列内移除,注意的是存取操作会影响Count的值,避免直接利用Count进行循环取出
  4. 队列的初始容量为32,增长因子为2.0,自增情况下为队列当前长度 * 增长因子

栈Stack

栈包含其特点:
  1. 后进先出(LIFO)的功能
  2. 通过使用Pop和push这两个方法来实现对 Stack 的存取。
  3. 存取操作时绝对的,存取后数据将会从栈内移除,注意的是存取操作会影响Count的值,避免直接利用Count进行循环取出
  4. 栈的初始容量为10,增长因子和自增与队列一样

双向链表LinkedList

链表包含其特点:
  1. 链表内的每一个元素可以链接前一个和后一个元素
  2. 双向列表可以进行正序,反序查询
优点:
  在进行结构中间的插入删除操作时,只需要修改相邻元素的属性即可
缺点:
  链表的元素只能一个接着一个访问,这可能需要较长的时间来查找链表的中间或查找顺序的尾部

你可能感兴趣的:(C#数据类型)