C# ArrayList、HashSet、HashTable、List、Dictionary的区别详解 C# 中有多种集合类,每种集合类都有其特点和应用场景。了解这些集合类的区别可以帮助开发者选择合适的集合类来提高程序的性能和可读性。本文将介绍 C# 中的 ArrayList、HashSet、HashTable、List、Dictionary 等集合类的区别和应用场景。 ArrayList 是一个可变长数组,可以将任意多的数据添加到 ArrayList 中。其内部维护的数组,当长度不足时,会自动扩容为原来的两倍。但是 ArrayList 也有一个缺点,就是存入 ArrayList 里面的数据都是 Object 类型的,所以如果将值类型存入和取出的时候会发生装箱、拆箱操作,这个会影响程序性能。在 .NET 2.0 泛型出现以后,就提供了 List<T>。List<T> 是 ArrayList 的泛型版本,它不再需要装箱拆箱,直接取,直接用,它基本与 ArrayList 一致,不过在使用的时候要先设置好它的类型,而设置好类型之后,不是这种类型的数据,是不允许 Add 进去的。 HashTable 是一种根据 key 查找非常快的键值数据结构,不能有重复 key,且由于其特点,其长度总是一个素数,所以扩容后容量会比 2 倍大一点点,加载因子为 0.72f。当要大量使用 key 来查找 value 的时候,HashTable 无疑是最优选择。HashTable 与 ArrayList 一样,是非泛型的,value 存进去是 object,存取会发生装箱、拆箱,所以出现了 Dictionary<T,T>。Dictionary<T,T> 是 HashTable 的泛型版本,存取同样快,但是不需要装箱和拆箱了。而且,其优化了算法,Hashtable 是 0.72,它的浪费容量少了很多。 HashSet<T> 类,算法、存储结构都与哈希表相同,主要是设计用来做高性能集运算的,例如对两个集合求交集、并集、差集等。集合中包含一组不重复出现且无特定顺序的元素。 Queue 队列,Queue<T> 泛型队列,大学都学过,队列,先进先出,很有用。Stack 堆栈,先进后出。 SortedList 集合中的数据是有序的。可以通过 key 来匹配数据,也可以通过 int 下标来获取数据。添加操作比 ArrayList 慢;查找、删除操作比 ArrayList 快,比 Hashtable 慢。 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 的类,充分利用了 Hashtable 查询效率高和 ListDictionary 占用内存空间少的优点,内置了 Hashtable 和 ListDictionary 两个容器,添加数据时内部逻辑如下:当数据量小于 8 时,Hashtable 为 null,用 ListDictionary 保存数据。当数据量大于 8 时,实例化 Hashtable,数据转移到 Hashtable 中,然后将 ListDictionary 置为 null。
- 粉丝: 4
- 资源: 947
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助