当前位置: 移动技术网 > IT编程>开发语言>c# > 详解如何选择使用ArrayList、HashTable、List、Dictionary数组

详解如何选择使用ArrayList、HashTable、List、Dictionary数组

2019年07月18日  | 移动技术网IT编程  | 我要评论

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

以上所述是本文的全部内容,希望对大家有所帮助!

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网