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。
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:二进制运算时可选用;
以上就是本次介绍的全部知识点内容,感谢大家对的支持。
上一篇: 2019年前端必用js正则(小结)
推荐阅读
-
HashTable、HashSet和Dictionary的区别点总结
-
C#中数组、ArrayList、List、Dictionary的用法与区别浅析(存取数据)
-
C#常见的几种集合 ArrayList,Hashtable,List
,Dictionary 遍历方法对比 -
C#介绍ArrayList和List的区别(第一篇内容博客 )
-
C# 中的集合(Array/ArrayList/List
/HashTable/Dictionary) -
C#中数组、ArrayList和List三者的区别详解及实例
-
聊聊C# 中HashTable与Dictionary的区别说明
-
C#中数组、ArrayList和List三者的区别
-
详解如何选择使用ArrayList、HashTable、List、Dictionary数组
-
C# ArrayList、HashSet、HashTable、List、Dictionary的区别详解