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,暂不做说明。