C#中数组、集合(ArrayList)、泛型集合List<T>、字典(dictionary<TKey,TValue>)全面对比c#
为何把这4个东西放在一块儿来讲,由于c#中的这4个对象都是用来存储数据的集合……。数组
首先我们把这4个对象都声明并实例化一下:安全
//数组性能
string[] m_Str = new string[5];对象
//集合索引
ArrayList m_AList = new ArrayList();内存
//泛型集合字符串
List<int> m_List = new List<int>();string
//字典io
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";
一、声明数组时[]里面有一个数字“5”,对了这就是区别,数组在声明的时候必需要指定长度。这是由于数组在内存中是连续存储的,因此它的索引速度很是快,并且赋值与修改元素也很简单。还有一点就是数组在声明定义的时候就指定了类型,咱们定义的数组的类型是string的,并且由于数组是连续的,这就致使咱们想在这个数组的第一个元素和第二个元素之间插队,插进一个成员是很不方便的。这就致使了咱们须要一个数据集合,这个集合能够方便的让咱们对该集合的成员进行add/delete/insert的操做.这就出现了集合(ArrayList)。
二、我们看第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类型的,因此也要拆箱到具体的类型中后再进行操做和使用。这样就会出现问题:一、消耗性能(频繁的拆箱和装箱)二、不安全,好比说上面的集合对象的第一个成员是字符型的,你取出来后和一个数值型的变量进行运算,就会报错……。那么接下来就又出现了一个对象——泛型集合(List<T>)对象。
三、泛型集合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.节省的性能,不须要每一操做成员的时候都要拆箱和装箱了。
泛型集合相比集合就相对完美了……
四、最后我们说说字典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个储存一组数据的对象我们就讲完了,下一章引用类型和值类型我们见。
可爱的小达…