在C#中,数组由于是固定长度的,所以常常不能满足我们开发的需求。

由于这种限制不方便,所以出现了ArrayList。

ArrayList、List<T>


ArrayList是可变长数组,你可以将任意多的数据Add到ArrayList里面。其内部维护的数组,当长度不足时,会自动扩容为原来的两倍。

但是ArrayList也有一个缺点,就是存入ArrayList里面的数据都是Object类型的,所以如果将值类型存入和取出的时候会发生装箱、拆箱操作(就是值类型与引用类型之间的转换),这个会影响程序性能。在.Net 2.0泛型出现以后,就提供了List<T>。

List<T>是ArrayList的泛型版本,它不再需要装箱拆箱,直接取,直接用,它基本与ArrayList一致,不过在使用的时候要先设置好它的类型,而设置好类型之后,不是这种类型的数据,是不允许Add进去的。

就性能来说,如果要存进数组的只有一种数据,那么无疑List<T>是最优选择。

List<int> ListInt = new List<int>();

如果一个变长数组,又要存int,又要存string。那么就只能用ArrayList。

HashTable(哈希表)、Dictionary<T,T>


HashTable是一种根据key查找非常快的键值数据结构,不能有重复key,而且由于其特点,其长度总是一个素数,所以扩容后容量会比2倍大一点点,加载因子为0.72f。

当要大量使用key来查找value的时候,HashTable无疑是最有选择,HashTable与ArrayList一样,是非泛型的,value存进去是object,存取会发生装箱、拆箱,所以出现了Dictionary<T,T>。

Dictionary<T,T>是HashTable的泛型版本,存取同样快,但是不需要装箱和拆箱了。而且,其优化了算法,Hashtable是0.72,它的浪费容量少了很多。

Dictionary<string,Person> Dic = new Dictionary<string,Person>();

HashSet<T>


HashSet<T>类,算法,存储结构都与哈希表相同,主要是设计用来做高性能集运算的,例如对两个集合求交集、并集、差集等。集合中包含一组不重复出现且无特定顺序的元素。

Queue、Queue<T>


Queue队列,Queue<T>泛型队列,大学都学过,队列,先进先出,很有用。

Stack、Stack<T>


Stack堆栈,先进后出。

SortedList、SortedList<TKey,TValue>


SortedList集合中的数据是有序的。可以通过key来匹配数据,也可以通过int下标来获取数据。

添加操作比ArrayList,Hashtable略慢;查找、删除操作比ArrayList快,比Hashtable慢。

SortedDictionary<TKey,TValue>


SortedDictionary<TKey,TValue>相比于SortedList<TKey,TValue>其性能优化了,SortedList<TKey,TValue>其内部维护的是数组而SortedDictionary<TKey,TValue>内部维护的是红黑树(平衡二叉树)的一种,因此其占用的内存,性能都好于SortedDictionary<TKey,TValue>。唯一差在不能用下标取值。

ListDictionary(单向链表),LinkedList<T>(双向链表)


List<T>,ArrayList,Hashtable等容器类,其内部维护的是数组Array来,ListDictionary和LinkedList<T>不用Array,而是用链表的形式来保存。链表最大的好处就是节约内存空间。

ListDictionary是单向链表。

LinkedList<T>双向链表。双向链表的优势,可以插入到任意位置。

HybridDictionary


HybridDictionary的类,充分利用了Hashtable查询效率高和ListDictionary占用内存空间少的优点,内置了Hashtable和ListDictionary两个容器,添加数据时内部逻辑如下:

当数据量小于8时,Hashtable为null,用ListDictionary保存数据。

当数据量大于8时,实例化Hashtable,数据转移到Hashtable中,然后将ListDictionary置为null。

BitArray


BitArray这个东东是用于二进制运算,"或"、"非"、"与"、"异或非"等这种操作,只能存true或false;

应用场景


ArrayList,List<T>:变长数组;

HashTable,Dictionary<T,T>:频繁根据key查找value;

HashSet<T>:集合运算;

Queue、Queue<T>:先进先出;

Stack、Stack<T>:堆栈,先进先出;

SortedList、SortedList<TKey,TValue>:哈希表,要通过下标,又要通过key取值时,可选用;

ListDictionary:单向链表,每次添加数据时都要遍历链表,数据量大时效率较低,数据量较大且插入频繁的情况下,不宜选用。

LinkedList<T>:双向链表;

HybridDictionary:未知数据量大小时,可用。

SortedDictionary<TKey,TValue>:SortedList<TKey,TValue>的优化版,内部数组转平衡二叉树。

BitArray:二进制运算时可选用;

转载于:https://www.cnblogs.com/zxbzl/p/5849714.html

ArrayList、HashTable、List、Dictionary的演化及如何选择使用相关推荐

  1. C#常见容器ArrayList、List、HashSet、Hashtable 、Dictionary、Stack、Queue

    一.ArrayList.List< T >列表和HashSet< T >哈希集 1.简单介绍及区别: 命名空间 System.Collections:ArrayList Sys ...

  2. C#方法,可空类型,数组,集合,ArrayList排序,List,Hashtable和Dictionary

    C#方法 方法的定义: public void/int Compare(int a,int b){ } Program program = new Program(); Console.WriteLi ...

  3. 聊聊C# 中HashTable与Dictionary的区别说明

    哈希表(HashTable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似keyvalue的键值对,其中ke ...

  4. C#中Hashtable、Dictionary详解以及写入和读取对比

    转载:http://www.cnblogs.com/chengxingliang/archive/2013/04/15/3020428.html 在本文中将从基础角度讲解HashTable.Dicti ...

  5. Hashtable与Dictionary

    以前对于这两个集合类的认识只是停留在是否支持泛型上,这几天趁着看算法导论的机会,把两个类的内部的实现机制好好的了解了一下. Hashtable 和Dictionary从数据结构上来说都属于Hashta ...

  6. C#中字典集合HashTable、Dictionary、ConcurrentDictionary三者区别

    C#中HashTable.Dictionary.ConcurrentDictionar三者都表示键/值对的集合,但是到底有什么区别,下面详细介绍 一.HashTable HashTable表示键/值对 ...

  7. C# Hashtable和Dictionary区别

    Hashtable和Dictionary都是.Net下的表示键值对的集合,那么我们在使用中该选择Hashtable还是Dictionary?下边我们看看他们之间的区别: 1.Dictionary< ...

  8. Hashtable和Dictionary 的区别

    Hashtable和Dictionary都是.Net下的表示键值对的集合,那么我们在使用中该选择Hashtable还是Dictionary?下边我们看看他们之间的区别: 1.Dictionary< ...

  9. vb.net 教程 1-14 Hashtable 和 Dictionary比较

    版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的. Hashtable 和 Dictionary 都是一个键值对的集合 其中 Hashtable 包 ...

最新文章

  1. Jenkins Pipeline动态使用Git分支名称的技巧
  2. 小撸 array map 源码
  3. Android 利用an框架快速实现网络请求(含下载上传文件)
  4. python3.7扩展库是什么_Python3.4以后的版本中,____________库用于安装管理Python扩展包,________________库用于发布Python包。_学小易找答案...
  5. Linux 源代码 安装vsftpd 2.3.4
  6. Neo4j:找到两个纬度/经度之间的中间点
  7. 标准正态分布表_表达矩阵的归一化和标准化,去除极端值,异常值
  8. 数字图像处理实验6图像编码
  9. java没有这样的元素异常_java – 没有这样的元素异常?
  10. 原生JS封装ajax方法
  11. OPPO首部5G手机亮相 10倍混合光学变焦技术惊艳MWC
  12. liunx centos 如何添加一个新的网卡
  13. g++ linux 编译开栈_linux下使用g++编译cpp工程
  14. JavaScript代码收集
  15. 基于惩罚函数的模拟退火算法求解有约束问题
  16. Inductive Matrix Completion Based on Graph Neural Networks
  17. War3地图编辑器基础:玩家设置+地图元素的属性设置+地图事件设置
  18. 地图原点半径距离经纬度计算
  19. Java(老白再次入门) - 语言概述
  20. 计算机网络技术职业现状分析,师范专科学校计算机网络技术专业现状与应对措施.doc...

热门文章

  1. python实现一个简单的加法计算器_Python tkinter实现简单加法计算器代码实例
  2. anaconda3配置环境变量_阿里云ECS配置Jupyter Notebook
  3. python函数的定义必须在程序的开头_Python之函数基础
  4. 学习MSCKF笔记——真实状态、标称状态、误差状态
  5. 【学员分享】程序员效率神器,最常用VIM插件安装大全
  6. 全球及中国水深测量声呐行业应用前景及未来投资决策建议报告2022-2027年
  7. 中国煤化工行业运行现状与前景规划动向预测报告2022-2028年
  8. Office HPDeskjetD2468 打印机电源灯闪烁不停,打印机不工作怎么办
  9. mysql 以数组的形式插入更新表
  10. IIS中架设二级域名网站