C# ArrayList、HashSet、HashTable、List、Dictionary的区别

在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。.net

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


HashTable是一种根据key查找很是快的键值数据结构,不能有重复key,并且因为其特色,其长度老是一个素数,因此扩容后容量会比2倍大一点点,加载因子为0.72f。设计

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

Dictionary<T,T>是HashTable的泛型版本,存取一样快,可是不须要装箱和拆箱了。并且,其优化了算法,Hashtable是0.72,它的浪费容量少了不少。blog

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://blog.csdn.net/wildlifeking/article/details/58605587

相关文章
相关标签/搜索