1. 程式人生 > >c#中陣列,ArrayList和List 三者的區別

c#中陣列,ArrayList和List 三者的區別

在c#中,陣列在記憶體中是連續的,索引速度很快,賦值和修改也很簡單。
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.Add(“abc”);  
  
//修改資料  
list[0] = “def”;  
  
//移除資料  
list.RemoveAt(0); 
上例中,如果我們往List集合中插入int陣列123,IDE就會報錯,而且不能通過編譯。這樣就避免了前面講的型別安全問題與裝箱拆箱操作的效能問題了。

總結:

陣列的容量是固定的,您只能一次獲取或設定一個元素的值,而ArrayList或List<T>的容量可根據需要自動擴充、修改、刪除或插入資料。

陣列可以具有多個維度,而ArrayList或List<T> 始終只具有一個維度。但是,您可以輕鬆建立陣列列表或列表的列表。特定型別(object除外)的陣列的效能優於ArrayList的效能。這是因為ArrayList的元素屬於Object型別;所以在儲存或檢索值型別時通常發生裝箱和拆箱操作。不過,在不需要重新分配時(即最初的容量十分接近列表的最大容量),List<T> 的效能與同類型的陣列十分接近。

在決定使用List<T> 還是使用ArrayList類(兩者具有類似的功能)時,記住List<T>類在大多數情況下執行的更好而且是型別安全的。如果對List<T>類在大多數情況下執行得更好並且是型別安全的。如果對List<T>類的型別T使用引用型別,則兩個類的行為是完全相同的。但是,如果對型別T使用值型別,則需要考慮實現和裝箱問題。