欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-11 08:49:28
在c#中,数组由于是固定长度的,所以常常不能满足我们开发的需求。 由于这种限制不方便,所以出现了arraylist。 arraylist、list...

在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:二进制运算时可选用;

以上就是本次介绍的全部知识点内容,感谢大家对的支持。