List、dictionary、hashtable、ArrayList集合

集合的引用命名空间在 system.Collections下

1、为什么引入集合

因为数组长度是固定的,为了建立一个动态的"数组",所以引入了集合。

2、为什么引入ArrayList 非泛型集合?

ArrayList可以填补数组的不足,进行元素的动态维护。数组的长度是固定的,而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();

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

 

上一篇:Java8 Lambda


下一篇:Codeforces 1203F2 Complete the Projects (hard version)