c#中陣列,ArrayList和List 三者的區別
string[] s=new string[2];
//賦值
s[0]="a";
s[1]="b";
//修改
s[1]="a1";
但是陣列也有一些不足的地方,在資料的兩個資料之間插入資料是很麻煩的,而且在宣告陣列的時候必須指定陣列的長度,陣列的長度過長就會造成記憶體的浪費,過短會造成記憶體溢位。如果在宣告陣列時我們不清楚陣列的長度,就會變得很麻煩,
針對陣列的這些缺點,c#最先提出了ArrayList物件來克服這些缺點。
ArrayList是名稱空間System.Collections下的一部分,在使用該類時必須引用,同時繼承了IList介面,提供了資料儲存和檢索。ArrayList物件的大小是按照其中儲存的資料來動態擴充與收縮的。所以,在宣告ArrayList物件時並不需要指定它的長度。
ArrayList list1 = new ArrayList();
//新增資料
list1.Add("cde");
list1.Add(5678);
//修改資料
list[2] = 34;
//移除資料
list.RemoveAt(0);
//插入資料
list.Insert(0, "qwe");
從上面的例子看來,ArrayList解決了所有陣列的缺點,那麼為什麼會出現list呢?
上述例子中,ArrayList不僅插入了字串code,而且還插入了數字5678,這樣在ArrayList中插入不同型別的資料是允許的。因為ArrayList會把所有插入其中的資料當做object型別來處理,在我們使用ArrayList處理資料時,很可能出現型別不匹配,也就是ArrayList不是型別安全的。在儲存或檢索型別時,通常會發生裝箱和拆箱的操作帶來很大的效能損耗。
裝箱和拆箱的概念:
簡單的說:
裝箱:就是將值型別的資料打包到引用型別的例項中
比如講string型別的值abc賦給object物件obj
object obj=(object)i;
裝箱和拆箱的過程是很損耗效能的。
泛型List
因為ArrayList存在不安全型別和裝箱拆箱的缺點,所以 出現了泛型的概念。List類時ArrayList類的泛型等效類。它的大部分使用者與ArrayList相似,因為List類也繼承了IList介面。最關鍵的區別在於,在宣告List集合時,我們同事需要為其宣告List集合內資料的物件型別:
比如:
上例中,如果我們往List集合中插入int陣列123,IDE就會報錯,而且不能通過編譯。這樣就避免了前面講的型別安全問題與裝箱拆箱操作的效能問題了。//新增資料 list.Add(“abc”); //修改資料 list[0] = “def”; //移除資料 list.RemoveAt(0);
總結:
陣列的容量是固定的,您只能一次獲取或設定一個元素的值,而ArrayList或List<T>的容量可根據需要自動擴充、修改、刪除或插入資料。
陣列可以具有多個維度,而ArrayList或List<T> 始終只具有一個維度。但是,您可以輕鬆建立陣列列表或列表的列表。特定型別(object除外)的陣列的效能優於ArrayList的效能。這是因為ArrayList的元素屬於Object型別;所以在儲存或檢索值型別時通常發生裝箱和拆箱操作。不過,在不需要重新分配時(即最初的容量十分接近列表的最大容量),List<T> 的效能與同類型的陣列十分接近。
在決定使用List<T> 還是使用ArrayList類(兩者具有類似的功能)時,記住List<T>類在大多數情況下執行的更好而且是型別安全的。如果對List<T>類在大多數情況下執行得更好並且是型別安全的。如果對List<T>類的型別T使用引用型別,則兩個類的行為是完全相同的。但是,如果對型別T使用值型別,則需要考慮實現和裝箱問題。