C#中数组、集合(ArrayList)、泛型集合List<T>、字典(dictionary<TKey,TValue>)全面对比

为什么把这4个东西放在一起来说,因为c#中的这4个对象都是用来存储数据的集合……。

首先咱们把这4个对象都声明并实例化一下:

//数组

string[] m_Str = new string[5];

//集合

ArrayList m_AList = new ArrayList();

//泛型集合

List<int> m_List = new List<int>();

//字典

Dictionary<int, string> m_Dt = new Dictionary<int, string>();

大家看看这4个对象放在一起从外观上有什么异同?

我给大家提个醒,看看他们是不是都有NEW关键字,也就是说他们都需要实例化,在说明白点他们都是引用类型(不知道引用类型为何物的也不用特别纠结,以后会专门说说这个区别)。

好了咱们继续看

//数组

string[] m_Str = new string[5];

m_Str[0] = "a";

m_Str[1] = "a";

m_Str[2] = "a";

  1、声明数组时[]里面有一个数字“5”,对了这就是区别,数组在声明的时候必须要指定长度。这是因为数组在内存中是连续存储的,所以它的索引速度非常快,而且赋值与修改元素也很简单。还有一点就是数组在声明定义的时候就指定了类型,我们定义的数组的类型是string的,而且因为数组是连续的,这就导致我们想在这个数组的第一个元素和第二个元素之间插队,插进一个成员是很不方便的。这就导致了我们需要一个数据集合,这个集合可以方便的让我们对该集合的成员进行add/delete/insert的操作.这就出现了集合(ArrayList)。

2、咱们看第2个对象集合(ArrayList),它在声明的时候既没有大小,也没有类型,这说明啥?说明他的大小是动态的你可以随意的add/delete/insert 如:

//集合

ArrayList m_AList = new ArrayList();

m_AList.Add("a");

m_AList.Add(10);

m_AList.Add(true);

m_AList.RemoveAt(0);

m_AList.Insert(1, "aa");

大家可能注意到集合ArrayList中Add的成员有字符串、数值、布尔值。这就说明了一个问题,集合中的每一个成员都是Object类型的,它把具体的成员装箱到object中在加入到自己。如果要是使用集合中的成员,因为成员是object类型的,所以也要拆箱到具体的类型中后再进行操作和使用。这样就会出现问题:1、消耗性能(频繁的拆箱和装箱)2、不安全,比如说上面的集合对象的第一个成员是字符型的,你取出来后和一个数值型的变量进行运算,就会报错……。那么接下来就又出现了一个对象——泛型集合(List<T>)对象。

  3、泛型集合list<T>对象,大家可能一看见这个就蒙了,反正我一开始看见是蒙了,尖括号是啥,T是啥?别慌,其实不难,尖括号就是一种语法,至于T可以理解成占位符,它可以是string、int、bool……等。咱们看看代码的用法:

//泛型集合

List<int> m_List = new List<int>();

m_List.Add(10);

m_List.Add(10);

m_List.Add(10);

m_List.RemoveAt(0);

m_List.Insert(1,12);

看起来好像和集合(ArrayList)的用法差不多,其实就是差不多了,哈哈。唯一的区别在于在声明泛型集合(List<T>)的时候需要制定里面成员的类型,上面的反省集合我们制定的类型是int的,这就是说你添加的成员必须也是int的,这会有啥好处?1.数据安全了,你添加string等非int类型的成员添加不进去(编译都过不去),这样数据就安全唯一了,2.节省的性能,不需要每一操作成员的时候都要拆箱和装箱了。

泛型集合相比集合就相对完美了……

  4、最后咱们说说字典Dictionary<TKey, TValue>,大家一看又蒙了,别慌,想想刚才的泛型集合(List<T>)

一样的,尖括号还是语法,你遵循就好了。而这一次的占位符不是T了,“因为第一个是索引,第二个是具体的值内容,”索引占位符变成额TKey, TValue。就这么简单呢。

下面咱们看看语法:

//字典

Dictionary<int, string> m_Dt = new Dictionary<int, string>();

m_Dt.Add(0, "a");

m_Dt.Add(1, "b");

m_Dt.Add(0, "c");

string str=m_Dt[0];

看着用法还是比较简单的吧,拿m_Dt.Add(0, "a");这一句来说0是该字典的【索引】,【值】是字符串a。要根据字典的【索引】找到具体的【值】,语法就是m_Dt[0];这样就取到了字符串a.

  大家回忆一下:因为数组的使用不方便,所以有了集合(ArrayList)。因为集合(ArrayList)的不安全和消耗性能所以有了泛型集合(list<T>).这就是这3者的关系——弥补缺点。至于字典这个因为它也是储蓄一组数据的集合,同时用到了泛型的东西,所以放在一起来说了。

好了这常见的4个储存一组数据的对象咱们就讲完了,下一章引用类型和值类型咱们见。

可爱的小达…

C#中数组、集合(ArrayList)、泛型集合List<T>、字典(dictionary<TKey,TValue>)全面对比的更多相关文章

  1. C# .Net 中字典Dictionary<TKey,TValue>泛型类 学习浅谈

    一.综述: Dictionary<TKey,TValue>是在 .NET Framework 2.0 版中是新增的.表示键值对的集合,Dictionary<TKey,TValue&g ...

  2. c# 图解泛型List<T>, HashTable和Dictionary<TKey,TValue>

    前辈在代码中使用了HashTable,由于我用的比较少,不能理解,为什么不用Dictionary?看了源码以及查阅资料,总结如下: 首先看看它们的继承体系: 我把list<T>的继承体系也 ...

  3. C#中数组、ArrayList和List三者的区别

    在C#中数组,ArrayList,List都能够存储一组对象,那么这三者到底有什么样的区别呢. 数组 数组在C#中最早出现的.在内存中是连续存储的,所以它的索引速度非常快,而且赋值与修改元素也很简单. ...

  4. C#中数组、ArrayList和List<T>三者的发展历程

    在C#中数组,ArrayList,List使我们用的最多的类型之一.他们共同的作用都是能够存储一组对象. 那么问题来了: (1)为什么要有三个一样作用的东西呢?他们都很完美吗? (2)谁先出生,又是因 ...

  5. C#非泛型集合和泛型集合的超级详解

    C# 泛型集合之非泛型集合类与泛型集合类的对应: ArrayList对应List HashTable对应Dictionary Queue对应Queue Stack对应Stack SortedList对 ...

  6. C#中数组、ArrayList和List三者的区别 转

    在C#中数组,ArrayList,List都能够存储一组对象,那么这三者到底有什么样的区别呢. 数组 数组在C#中最早出现的.在内存中是连续存储的,所以它的索引速度非常快,而且赋值与修改元素也很简单. ...

  7. C#集合与泛型集合

    看到这个标题,大家应该就知道有泛型集合,就有非泛型集合 既然都是集合,咱们今儿就简单的来对比讲解下 需要记住的不算太多,理解记忆.理解记忆 2017-11-0411:39:09 C# 泛型集合之非泛型 ...

  8. 将java中数组转换为ArrayList的方法实例(包括ArrayList转数组)

    方法一:使用Arrays.asList()方法   1 2 String[] asset = {"equity", "stocks", "gold&q ...

  9. 【转载】 C#中数组、ArrayList和List三者的区别

    原文地址:http://blog.csdn.net/zhang_xinxiu/article/details/8657431 在C#中数组,ArrayList,List都能够存储一组对象,那么这三者到 ...

随机推荐

  1. janusgraph-遍历图的语言

    精确查询 语句含义 测试语句 执行时间 查询顶点标签为FALV的顶点数量 g.V().hasLabel('FALV').count() 2400s 查询顶点属性中id为19012201 clockWi ...

  2. ubuntu18.04 + python3 安装pip3

    最近在学习python 网络爬虫,正好接触到python的requests模块 我的开发环境是ubuntu18.04+python3,这个系统是默认自带了python3,且版本是python 3.6. ...

  3. select 与 I/O多路转接

    参考博客:http://blog.sina.com.cn/s/blog_607072980102uxcw.html I/0多路转接: 描述符表示某个I/O.构造一张有关描述符的数据表,调用select ...

  4. 11、 Hadoop 2.x各个服务组件如何配置在那台服务器运行并测试

    HDFS模块 NameNode:是由哪个文件中的哪个配置属性指定的呢? core-site.xml文件中: <property> <name>fs.defaultFS</ ...

  5. less简介及其编译原理

    一.less环境安装 ①首先需要在电脑上安装nodejs,一般会内置npm,利用以下命令可以检测: ②利用npm在线安装less,运行  npm install –g less ③查看是否安装成功,L ...

  6. 26-ESP8266 SDK开发基础入门篇--编写WIFI模块 SmartConfig/Airkiss 一键配网

    https://www.cnblogs.com/yangfengwu/p/11427504.html SmartConfig/Airkiss 配网需要APP/微信公众号,这节大家先使用我做好的APP/ ...

  7. 数据分析师(Data Analyst),数据工程师(Data Engineer),数据科学家(Data Scientist)的区别

    数据分析师(Data Analyst):负责从数据中提取出有用的信息,以帮助公司形成业务决策.工作内容包括:对数据进行提取,清洗,分析(用描述统计量,趋势分析,多维度分析,假设检验等统计常用方法对数据 ...

  8. web前端开发面试被虐篇(一)

    地点:北京 职位:前端开发工程师 要求:达到中级开发,JS基础足够扎实,css基础扎实,要求纯手写代码 面试过程: 进门一个面相老成的大叔递给我一份题,说别的都不好使先做题看看水平,说话语气很温和明显 ...

  9. 第12组 Beta冲刺(1/5)

    Header 队名:To Be Done 组长博客 作业博客 团队项目进行情况 燃尽图(组内共享) 展示Git当日代码/文档签入记录(组内共享) 注: 由于GitHub的免费范围内对多人开发存在较多限 ...

  10. Win7下安装VS2017、安装Qt5.10.1以及在VS2017添加qt插件

    一.安装VS2017 1.下载VS2017 进入vs下载官网https://www.visualstudio.com/zh-hans/downloads/,选择所需要的vs版本,进行在线安装. 2.安 ...