在C#中,数组由于是固定长度的,所以常常不能满足我们开发的需求。
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:二进制运算时可选用;
ArrayList、HashSet、HashTable、List、Dictionary的区别的更多相关文章
-
C#中的HashSet, HashTable, Dictionary的区别【转】
HashSet和Python中的Set差不多,都是为逻辑运算准备的,HashSet不允许数据有重复,且存入的时单值不是键值对. HashTable和Dictionary差不多,但是他们的实现方式时不同 ...
-
C#中Dictionary、ArrayList、Hashtable和Array的区别
IDictionary接口是所有字典类集合的基本接口,该接口与ICollection,IEnumerable接口是所有非泛型类集合的最基本的接口 IEnumerable接口用于公开枚举数,该枚举数支持 ...
-
HashTable、HashSet和Dictionary的区别
今天又去面试了,结果依然很悲催,平时太过于关注表面上的东西,有些实质却不太清楚,遇到HashTable和Dictionary相关的知识,记录下来,希望对后来人有所帮助,以及对自己以后复习可以参考. 1 ...
-
HashTable、HashSet和Dictionary的区别(转载)
1.HashTable哈希表(HashTable)表示键/值对的集合.在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类 ...
-
C#高级应用之------HashTable、HashSet和Dictionary的区别(转)
原文url:http://www.cnblogs.com/akwwl/p/3680376.html 今天又去面试了,结果依然很悲催,平时太过于关注表面上的东西,有些实质却不太清楚,遇到HashTabl ...
-
hashset hastable dictionary concurrentdictionary区别
1.HashTable 哈希表(HashTable)表示键/值对的集合.在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现 ...
-
Hashtable,HashMap,Dictionary的区别
Hashtable和HashMap的区别:1.Hashtable是基于Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现,c#中无HashMap2.Hashtable ...
-
C# ArrayList、HashSet、HashTable、List、Dictionary的区别
在C#中,数组由于是固定长度的,所以常常不能满足我们开发的需求. 由于这种限制不方便,所以出现了ArrayList. ArrayList.List<T> ArrayList是可变长数组,你 ...
-
泛型与非泛型集合类的区别及使用例程,包括ArrayList,Hashtable,List<;T>;,Dictionary<;Tkey,Tvalue>;,SortedList<;Tkey,Tvalue>;,Queue<;T>;,Stack<;T>;等
泛型与非泛型集合类在C#程序中是非常重要的一个基础概念,这里列一个表来进行对比: 非泛型集合类 泛型集合类 描述 ArrayList List<T> 表示具有动态大小的对象数组 Hasht ...
随机推荐
-
丰富“WinForms” 的一个别样";项目";(学生管理)
一个别样的WinForms项目,他并没多么的新颖,但是它的用处确实有点多,或许会有你需要的地方:如果你对WinForms中那么多控件无法把握,又或者是你根本就不懂,那我觉得你应该好好看看,如果一个人的 ...
-
NOIP2011 普及組 統計單詞數
题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给 ...
-
IE (6-11)版本,在使用iframe的框架时,通过a标签javascript:; 和js跳转parent.location的时候 出现在新页面打开的情况
问题描述: 使用iframe的情况下,在子框架中,使用如下形式的跳转: <a href="javascript:;" onclick="parent.locatio ...
-
2712:细菌繁殖-poj
2712:细菌繁殖 总时间限制: 1000ms 内存限制: 65536kB 描述 一种细菌的繁殖速度是每天成倍增长.例如:第一天有10个,第二天就变成20个,第三天变成40个,第四天变成80个,… ...
-
PHP——判断是否为加密协议https
前言 就是一个封装的方法,用来判断域名前面是加http还是https 代码 function is_ssl() { if(isset($_SERVER['HTTPS']) && ('1 ...
-
CodeCombat编程游戏
一. 介绍 官方网站:http://cn.codecombat.com/ 项目地址:https://github.com/codecombat/codecombat CodeCombat 是一个通过玩 ...
-
Ubuntu 16.04卸载一些不必要的预装软件
卸载libreoffices ~$ sudo apt-get remove libreoffice-common 卸载Amazon的链接 ~$ sudo apt-get remove unity-we ...
-
read later
https://groups.google.com/forum/#!msg/pylearn-users/FYtpaQKoC4c/ubitO_JUC1kJ 网上论坛 发布回复 ...
-
hdu3613 Best Reward manacher+贪心+前缀和
After an uphill battle, General Li won a great victory. Now the head of state decide to reward him w ...
-
修复android下webView控件的总结
游戏中有一个收集玩家问题反馈的网页,很早之前就有同事反映说android在游戏无法上传附件,在浏览器中是可以正常使用的.最近能腾出手来的时候,就仔细看了一下这个问题,发现很里藏着不少问题,这里一一记录 ...