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

C#中数组、集合(ArrayList)、泛型集合List、字典(dictionary)全面对比

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

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

//数组

string[] m_Str = new string[5];

//集合

ArrayList m_AList = new ArrayList();

//泛型集合

List m_List = new List();

//字典

Dictionary m_Dt = new Dictionary();

大家看看这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)对象。

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

//泛型集合

List m_List = new List();

m_List.Add(10);

m_List.Add(10);

m_List.Add(10);

m_List.RemoveAt(0);

m_List.Insert(1,12);

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

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

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

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

下面咱们看看语法:

//字典

Dictionary m_Dt = new Dictionary();

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).这就是这3者的关系——弥补缺点。至于字典这个因为它也是储蓄一组数据的集合,同时用到了泛型的东西,所以放在一起来说了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容