首先我们把这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关键字,也就是说他们都须要实例化,在说明白点他们都是引用类型(不知道引用类型为什么物的也不用特别纠结,之后会专门说说这个区别)。post
好了我们继续看性能
数组
声明数组时[]里面有一个数字“5”,对了这就是区别,数组在声明的时候必需要指定长度。这是由于数组在内存中是连续存储的,因此它的索引速度很是快,并且赋值与修改元素也很简单。还有一点就是数组在声明定义的时候就指定了类型,咱们定义的数组的类型是string的,并且由于数组是连续的,这就致使咱们想在这个数组的第一个元素和第二个元素之间插队,插进一个成员是很不方便的。这就致使了咱们须要一个数据集合,这个集合能够方便的让咱们对该集合的成员进行add/delete/insert的操做.这就出现了集合(ArrayList)。spa
//数组 string[] m_Str = new string[5]; m_Str[0] = "a"; m_Str[1] = "a"; m_Str[2] = "a";
集合
我们看第2个对象集合(ArrayList),它在声明的时候既没有大小,也没有类型,这说明啥?说明他的大小是动态的你能够随意的add/delete/insert 如:code
//集合 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……等。我们看看代码的用法:blog
//泛型集合 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.节省的性能,不须要每一操做成员的时候都要拆箱和装箱了。索引
泛型集合相比集合就相对完美了……
泛型集合List(C#)-注意事项
【1】 使用前必须实例化
能够单纯实例化、也能够实例化时使用“集合初始化器”初始化。
【2】经常使用方法
添加元素:Add()、Insert()
删除元素:RemoveAt(索引)、Remove(对象)、Clear()
【3】经常使用属性
获取元素个数:Count(对比数组 :Length)
【4】集合遍历
使用for循环、也可使用foreach循环。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ListDemo { class Program { static void Main(string[] args) { //泛型集合的基本使用 List<int> scoreList = new List<int>(); scoreList.Add(98); scoreList.Add(28); scoreList.Add(38); scoreList.Add(78); scoreList.Add(88); //List<string> nameList = new List<string>(); scoreList.Insert(2, 70); //获取元素总数 Console.WriteLine("获取元素总数:"+scoreList.Count ); Console.WriteLine("_________________"); //Console.ReadLine(); //遍历集合 Console.WriteLine("遍历输出在第一种方法:"); foreach (int score in scoreList) { Console.WriteLine(score); } Console.WriteLine("_________________"); Console.WriteLine("遍历输出在第二种方法:"); for (int i = 0; i < scoreList.Count; i++) { Console.WriteLine(scoreList[i]); } //删除一个元素 Console.WriteLine("_________________"); Console.WriteLine(" 删除一个元素"); scoreList.Remove(70); scoreList.Remove(2); for (int i = 0; i < scoreList.Count; i++) { Console.WriteLine(scoreList[i]); } Console.WriteLine("_________________"); Console.WriteLine("清除全部元素"); scoreList.Clear(); Console.WriteLine("获取元素总数:" + scoreList.Count); Console.ReadLine(); } } }
字典Dictionary
最后我们说说字典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个储存一组数据的对象我们就讲完了,下一章引用类型和值类型我们见。