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,暫不做說明。