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

C#常见几种集合比较的更多相关文章

  1. JAVA:三种集合LIST、SET、MAP

    1. 集合框架介绍 我 们知道,计算机的优势在于处理大量的数据,在编程开发中,为处理大量的数据,必须具备相应的存储结构,数组可以用来存储并处理大量类型相同的数 据,但是会发现数组在应用中的限制:数组长 ...

  2. Windows Phone中的几种集合控件

    前言 Windows Phone开发过程中不可避免的就是和集合数据打交道,如果之前做过WP App的开发的话,相信你已经看过了各种集合控件的使用.扩展和自定义.这些个内容在这篇博客里都没有,那么我们今 ...

  3. 【转】.NET+AE开发中常见几种非托管对象的释放

    尝试读取或写入受保护的内存.这通常指示其他内存已损坏. 今天在开发时遇到一个问题:" 未处理 System.AccessViolationException Message="尝试 ...

  4. Mysql的常见几种错误:1045,1044

    Mysql的常见几种错误: 一.在进入 mysql 数据库时出错   # mysql -u root -p Enter password: ERROR 1045 (28000): Access den ...

  5. css中常见几种float方式以及倒计时(刷新页面不清)

    css中常见几种float方式 http://jingyan.baidu.com/article/72ee561a670269e16138dfd5.html <script type=" ...

  6. Python发送邮件(常见四种邮件内容)

    Python发送邮件(常见四种邮件内容) 转载 2017年03月03日 17:17:04   转自:http://lizhenliang.blog.51cto.com/7876557/1875330 ...

  7. Spring学习(三)几种集合属性的注入方式

    1.前言 众所周知.java中不只有八大简单类型.还有一些集合类型.本文围绕集合类型的注入做一个总结. 2.项目骨架 3.过程 1.创建实体类AllCollectionType package com ...

  8. 常见三种存储方式DAS、NAS、SAN的架构及比较

    转至:https://blog.csdn.net/shipeng1022/article/details/72862367 随着主机.磁盘.网络等技术的发展,数据存储的方式和架构也在一直不停改变,本文 ...

  9. http常见7种请求

    抛砖引玉,聊下概念性的东西先: HTTP协议 (Hyper Text Transfer Protocol) HTTP是一个基于TCP/IP通信协议来传递数据,包括html文件.图像.结果等,即是一个客 ...

随机推荐

  1. Tomcat指定特定的java

    Tomcat指定特定的java 制作人:全心全意 安装好Tomcat后,进入bin目录,找到setclasspath.bat或setclasspath.sh文件,在文件前加入以下内容 Windows: ...

  2. C# interact with Command prompt

    using System.IO; using System.Diagnostics; static void Main(string[] args) { CmdDemo("dir" ...

  3. yii2 response响应配置

    response参数配置 方式一.全局配置 用于接口开发 适用:只有所有请求都是application/json类型时可用. $config = [ 'components' => [ 'res ...

  4. openlayers显示区域

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  5. simon effect (psychology experiment ) : build the function of wait4key()

    ## #the real experiment for simon effect #load the library which is our need import pygame import sy ...

  6. install multiple versions of CUDA

    https://www.pugetsystems.com/labs/hpc/How-To-Install-CUDA-10-together-with-9-2-on-Ubuntu-18-04-with- ...

  7. FLUSH+RELOAD技术

    FLUSH+RELOAD技术是PRIME+PROBE技术的变体,攻击间谍进程和目标进程的共享页.在共享页中,间谍进程可以确保一个特定的内存的映射从整个cache的层级中剔除.间谍进程就是使用这一点去监 ...

  8. 使用ResXmanager实现多语言[转]

    1 多國語系 - 使用RESXMANAGER管理資源檔 1.1 前言 在實作多國語系網站時,針對靜態文字多會使用資源檔(Resource)來對應出各語系所需顯示的內容.由於資源檔可能會依照特定結構放式 ...

  9. C#调用C++类库例子

    一.新建一个解决方案,并在解决方案下添加一个.netframework的项目,命名为FrameworkConsoleTest.再添加一个C++的动态链接库DLL项目,命名为EncryptBase. 二 ...

  10. mac屏幕录制

    屏幕录制 shift+command+5 录制完成后将文件拖拽到要保存的文件中