• 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

  • 相关阅读:
    End of 2007, where are you?
    2007年,前进!
    PHP框架Yii快速搭建高并发网站
    需要 gmail 与 wallop 邀请的 请留言给 email
    开始关注Mono了
    百度,阿里巴巴,google
    重返 cnblogs.com
    解决VMware虚拟机桥接不能上网的问题
    SecureCRT
    linux的ssh和sshd配置
  • 原文地址:https://www.cnblogs.com/zhoushiya/p/12107606.html
Copyright © 2020-2023  润新知