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

猜你喜欢

转载自www.cnblogs.com/zhoushiya/p/12107606.html