C#中陣列Array、ArrayList、泛型List<T>的比較

發表於2016-06-17

在C#中陣列Array,ArrayList,泛型List都能夠儲存一組物件,但是在開發中根本不知道用哪個效能最高,下面我們慢慢分析分析。

一、陣列Array

陣列是一個儲存相同型別元素的固定大小的順序集合。陣列是用來儲存資料的集合,通常認為陣列是一個同一型別變數的集合。

Array 類是 C# 中所有陣列的基類,它是在 System 名稱空間中定義。

陣列在記憶體中是連續儲存的,所以它的索引速度非常快,而且賦值與修改元素也非常簡單。

Array陣列具體用法:

陣列雖然儲存檢索資料很快,但是也有一些缺點:

1、在宣告陣列的時候必須指定陣列的長度,如果不清楚陣列的長度,就會變得很麻煩。

2、陣列的長度太長,會造成記憶體浪費;太短會造成資料溢位的錯誤。

3、在陣列的兩個資料間插入資料是很麻煩的

更多參考微軟官方文件:Array 類 (System)

二、ArrayList

既然陣列有很多缺點,C#就提供了ArrayList物件來克服這些缺點。

ArrayList是在名稱空間System.Collections下,在使用該類時必須進行引用,同時繼承了IList介面,提供了資料儲存和檢索。

ArrayList物件的大小是按照其中儲存的資料來動態擴充與收縮的。因此在宣告ArrayList物件時並不需要指定它的長度。

ArrayList 的預設初始容量為 0。隨著元素新增到 ArrayList 中,容量會根據需要通過重新分配自動增加。可通過呼叫 TrimToSize 或通過顯式設定 Capacity 屬性減少容量。

執行結果:

ArrayList解決了陣列中所有的缺點,但是在儲存或檢索值型別時通常發生裝箱和取消裝箱操作,帶來很大的效能耗損。尤其是裝箱操作,例如:

在List中,先插入了字串joye.net,而且插入了int型別27。這樣在ArrayList中插入不同型別的資料是允許的。因為ArrayList會把所有插入其中的資料當作為object型別來處理,在使用ArrayList處理資料時,很可能會報型別不匹配的錯誤,也就是ArrayList不是型別安全的

更多參考微軟官方ArrayList文件:ArrayList 類 (System.Collections)

三、泛型List<T>

由於ArrayList存在不安全型別與裝箱拆箱的缺點,所以出現了泛型的概念。

List 類是 ArrayList 類的泛型等效類。該類使用大小可按需動態增加的陣列實現 IList 泛型介面,大部分用法都與ArrayList相似。

List<T> 是型別安全的,在宣告List集合時,必須為其宣告List集合內資料的物件型別。

如果宣告List集合內資料的物件型別是string,然後往List集合中插入int型別的111,IDE就會報錯,且不能通過編譯。顯然這樣List<T>是型別安全的。

對返回結果集再封裝:

更多參考微軟官方文件:List泛型類

四、總結

1、陣列的容量固定,而ArrayList或List<T>的容量可根據需要自動擴充。

2、陣列可有多個維度,而 ArrayList或 List<T> 始終只有一個維度。(可以建立陣列列表或列表的列表)

3、特定型別的陣列效能優於 ArrayList的效能(不包括Object,因為 ArrayList的元素是 Object ,在儲存或檢索值型別時通常發生裝箱和取消裝箱操作)。

4、 ArrayList 和 List<T>基本等效,如果List <T>類的型別T是引用型別,則兩個類的行為是完全相同的。如果T是值型別,需要考慮裝箱和拆箱造成的效能損耗。List<T> 是型別安全。

相關文章