C#常见几种集合比较
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C#常见⼏种集合⽐较
1. ArrayList
1.1 ArrayList是⼀个特殊数组,通过添加和删除元素就可以动态改变数组的长度。
ArrayList集合相对于数组的优点:⽀持⾃动改变⼤⼩,可以灵活的插⼊元素,可以灵活的删除元素,可以灵活的访问元素,但是ArrayList只⽀持⼀维,并且查询和检索的。
1.2 速度⽐较慢。
在C#中数据类型分为两类:值类型和引⽤类型。
int bool char double enum struct DateTime等都是值类型(值类型和引⽤类型的重要特征在于,值类型的长度固定,⽽引⽤类型的长度不固定),string Array class集合等都是引⽤类型。
如果是值类型直接存储在栈中(局部变量),如果是引⽤类型,先把数据存储在堆中,然后把堆的地址存储在栈中。
object类是所有类的基类,所有的数据类型都可以转换成object类,这就是为什么ArrayList可以存储值类型和引⽤类型,因为在存储的时候全被转换成object类型存储这也是ArrayList的⼀个缺点,就是存储的时候需要把值类型封装成object类型,取出来的时候需要再把object类型再转换成值类型,这⼀装箱和拆箱的过程⾮常消耗性能。
装箱:如果往ArrayList中存储值类型的数据,在存储的时候需要转换成object类型存储,由值类型封装成object类型的过程称为装箱。
拆箱:由object类型转换成值类型的过程称为拆箱。
2. List
继承了ArrayList的特点,但是声明时需要指定类型,减少了装箱拆箱操作,提升了性能。
有索引,可以进⾏排序,修改等等。
3. LinkedList(链表)
ArrayList或者List都有个缺陷,插⼊元素或者移除元素时速度较慢,因为存在后续元素的位置变化。
LinkedList每个元素记录下⼀个元素的位置,那么就插⼊或者移除元素时只需要修改标记即可,不⽤移动后⾯的元素了,⼤⼤提⾼了效率。
ArrayList vs List vs LinkedList: 尽量避免使⽤ArrayList,多线程时候可以⽤ConcurrentBag。
==插⼊、删除较多⽤LinkedList,否则⽤List == 包(Bag)包可包含重复元素(此处对应List)。
集(Set)集中不能包含重复元素。
4. HashTable
4.1 key-value组合,可以添加不同类型的数据,取出之后需要转换成对应类型
Hashtable hashtable = new Hashtable();
hashtable.Add("名字", "⼩丽");
hashtable.Add("年龄", 22);
return hashtable;
4.2 HashTable线程安全,允许单线程写⼊,多线程读取。
5. Dictionary
5.1 key-value组合,必须指定数据类型
5.2 速度较快,不必装箱拆箱
5.3 ⾮线程安全(即使这样,也可以⽤ConcurrentDictionary代替)
HashTable vs Dictionary :
Dictionary效率⾼,但是⼈为lock保持线程安全时效率反⽽低下。
多线程编程需要ConcurrentDictionary,单线程需要Dictionary。
优化⼩技巧:由于Dictionary有底层有桶和链表结构,有时候将List转为Dictionary进⾏操作(⽤主键作为key),反⽽效率更⾼。
插⼊性能:List < HashTable < Dictionary < LinkedList
遍历性能:HashTable < Dictionary < LinkedList < List
删除性能:List < HashTable < LinkedList < Dictionary
5. Queue
队列:先进先出(FIFO)
6. Stak
栈:后进先出(LIFO)
7. HashSet<T>和SortedSet<T>
7.1 都属于集(Set:元素不可重复),加⼊重复元素时并不会报错。
SortedSet还有排序的功能,例如加⼊1、3、2,foreach会得到1、2、3。