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. node--处理一个增加上传操作和渲染页数条

    一段学习的结束 我也不知道我这是在写些什么,只是觉得学完了一些东西,就是想把它记录 一下,这样我就可以知道我是学过这一块的,要多激励自己,^^O(∩∩)O哈哈~ 以下内容并不完全与标题匹配,不过以下内 ...

  2. gulp常用插件之gulp-rev-format使用

    更多gulp常用插件使用请访问:gulp常用插件汇总 gulp-rev-format这是一款提供静态资产的哈希格式选项(前缀,后缀,最后扩展名). 更多使用文档请点击访问gulp-rev-format ...

  3. F. Moving Points

    https://codeforces.com/contest/1311/problem/F 这是一道线段树类型的题: 可以用权值线段树或者树状数组来解: 所以,我们可以分为两部分,第一部分是计算出到当 ...

  4. BZOJ2780(广义后缀自动机,set启发式合并)

    BZOJ2780(广义后缀自动机,set启发式合并) 题面 自己找去 HINT 就是给多个文本串,然后每次查询的时候问你这个串在多少个文本串中出现过.因为多个文本串,那么直接就往广义后缀自动机上思考啊 ...

  5. Java内置锁的简单认识

    多线程开发离不开锁机制,现在的Java语言中,提供了2种锁,一种是语言特性提供的内置锁,还有一种是 java.util.concurrent.locks 包中的锁,这篇文章简单整理一下内置锁的知识点. ...

  6. C# LINQ学习笔记五:LINQ to XML

    本笔记摘抄自:https://www.cnblogs.com/yaozhenfa/p/CSharp_Linq_For_Xml.html,记录一下学习过程以备后续查用. 一.生成xml 1.1创建简单的 ...

  7. Eclispe WEB项目 转到 IDEA 后无法部署问题

    IDEA是个强大的IDE  这个就不用多说了 Eclispe 的Web项目  转到IDEA之后,开始部署会出现大量的问题 项目从SVN下载下来的时候,大概就是这个样 第一步是先设置  项目结构  也就 ...

  8. mybatis第一天02

    mybatis第二天02 1.映射文件之输入输出映射 1.1映射文件之输入映射类型(parameterType) 1.1.1简单类型 当parameterType为简单类型时,我们只需要直接填写“in ...

  9. Treats for the Cows POJ - 3186 dp 区间dp

    //dp[i][j]表示第i次从左边取,第j次从右边取的价值,所以我们可以得到状态方程 //dp[i][j]=max(dp[i-1][j]+(i+j)*a[i],dp[i][j-1]+(i+j)*a[ ...

  10. var s=+newDate();

    var s=+newDate(); 解释如下:=+是不存在的; +new Date()是一个东西; +相当于.valueOf(); 看到回复补充一下.getTime()这个也是得到毫秒数 //4个结果 ...