C#集合总结
1.为什么引入集合?
因为数组长度是固定的,为了建立一个动态的"数组",所以引入了集合。
2.为什么引入ArrayList 非泛型集合?
ArrayList可以填补数组的不足,进行元素的动态维护。数组的长度是固定的,而ArrayList的容量可以根据需要自动扩充,它的索引会根据程序的扩展而重新分配和调整。
//创建 ArrayList studentList = new ArrayList(); //添加 studentList.Add(new Student { StudentNo = "01", RealName = "学生01" }); studentList.Add(new Student { StudentNo = "02", RealName = "学生02" }); studentList.Add(new Student { StudentNo = "03", RealName = "学生03" }); //读取 Student target = (Student)studentList[0]; //删除 根可根据索引删除指定元素。由于添加和删除会导致ArrayList索引自动分配和调整,删除一个元素后(如果不是最后一个元素),其他元素的索引可能会受影响。 studentList.RemoveAt(0); studentList.RemoveAt(1); //studentList.RemoveAt(2);//取消注释会导致程序报错,因为删除两个元素后,列表只有一个元素,最大的索引为0。 //清空 studentList.Clear();
ArrayList说明:
ArrayList是非泛型集合,添加和读取数据有装箱拆箱,所以会有性能损失。
3.为什么引入HashTable(哈希表、散列表) 非泛型集合?
对于ArrayList集合我们通常会使用索引访问操作元素,但是这样的话就存在一个问题,使用这种方式必须知道要操作的索引是多少。Hashtable可以针对这种情况解决问题,它为每个元素都取了一个有意义并且唯一的关键字,然后通过关键字来访问元素。Hashtable的数据是通过(key)键和值(value)来组织的,所以也叫"字典"。
//创建 Hashtable hashtable = new Hashtable(); //添加 hashtable.Add("key1", "value1"); hashtable.Add("key2", "value2"); //读取 string val1 = (string)hashtable["key1"]; object val3 = hashtable["key3"];//null //删除 hashtable.Remove("key1"); //清空 hashtable.Clear();
HashTable说明:
Hashtable元素时只能使用通过key来取值,键和值均是object类型,键不可重复。读取一个不存在的key,得到的value为null。
Hashtable是非泛型集合,添加和读取数据有装箱拆箱,所以会有性能损失。
4.为什么引入泛型集合?
非泛型集合对元素的数据类型没有约束性,在添加时数据类型都会被转为Object类型(装箱拆箱导致性能损失),读取的时候也不知道对象的具体的类型,所以在元素数据类型转换的时候就存在了不确定性(类型不安全)。
而泛型集合限定了集合中的数据类型(类型安全),没有装箱拆箱(没有性能损失)。
5.为什么引入List<T>泛型集合?
List<T>泛型集合是ArrayList非泛型集合的升级版,是类型安全的,没有装箱和拆箱的性能损耗。
//创建 List<Student> list = new List<Student>(); //添加 list.Add(new Student { RealName = "学生001" }); //读取 Student student = list[0]; //删除 list.RemoveAt(0); //清空 list.Clear();
6.为什么引入Dictionary<K,V>?
Dictionary<K,V>泛型集合是HashTable非泛型集合的升级版,是类型安全的,没有装箱和拆箱的性能损耗。
//创建 Dictionary<string, string> dict = new Dictionary<string, string>(); //添加 dict.Add("key1", "value1"); //读取 string value = dict["key1"]; //删除 dict.Remove("key1"); //清空 dict.Clear();
总结
为了建立一个动态的"数组",引入了非泛型ArrayList。
为了建立一个"字典",引入了非泛型HashTable。
为了建立一个动态的类型安全的"数组",引入了泛型List<T>。
为了建立一个类型安全的"字典",引入了泛型Dictionary<object,object>。
为了排序,引入了SortedList SortedDictionary,暂不做说明。