深究C#中數組、ArrayList和List三者的區別

前言:在C#中數組,ArrayList,List都能夠存儲一組對象,那麼這三者到底有什麼樣的區別呢?在本篇博文中,讓我們共同探討!概況內容請見本人另一篇博文:淺談C#中數組、ArrayList和List三者的區別

一、數組

1、概念

對於數組,相信我們大家都很熟悉了,它是一種數據結構,其中包含許多通過計算索引訪問的變量。 數組中的變量(亦稱爲數組的元素)均爲同一種類型,我們將這種類型稱爲數組的元素類型。

同時我們也要知道,數組的類型是引用類型,聲明數組變量只是爲引用數組實例預留空間。 實際的數組實例是在運行時使用 new 運算符動態創建而成。 new 運算指定了新數組實例的長度,然後在此實例的生存期內固定使用這個長度。 數組元素的索引介於 0 到 Length - 1 之間。 new 運算符自動將數組元素初始化爲其默認值(例如,所有數值類型的默認值爲 0,所有引用類型的默認值爲 null)。

不僅如此,數組在內存中是連續存儲的,所以它的索引速度非常快,而且賦值與修改元素也很簡單。

2、示例

//數組
string[] str=new string[2];
//賦值
str[0]="a";
str[1]="b";
//修改
str[1]="a1";

3、反思

看到這裏,相信大家已經發現了數組的不足之處,當然這個在我們數組的概念中也有體現。也就是說我們的數組在實例化時,必須指定長度,那麼此數組的生存期內,將固定使用這個長度。相信到這裏,我們大家就會發現,如果數組定義太長就會造成內存浪費,定義太短就會造成數據溢出的錯誤。那麼當我們在聲明數組時,可能並不清楚數組的長度,此時問題就變的很棘手了。

不僅如此,我們的數組空間是連續,這也導致了存儲效率低,插入和刪除元素效率比較低,而且麻煩。如果,要增添一個元素,需要移動大量元素,在內存中空出一個元素的空間,然後將要增加的元素放在其中。同樣,你想刪除一個元素,需要移動大量元素去填補被移動的元素。

針對數組的這些缺點,C#中最先提供了ArrayList對象來克服這些缺點。

二、ArrayList

1、概念

ArrayList是.Net Framework提供的用於數據存儲和檢索的專用類,它是命名空間System.Collections下的一部分。在使用該類時必須進行引用,同時繼承了IList接口,提供了數據存儲和檢索。它的大小是按照其中存儲的數據來動態擴充與收縮的。所以,我們在聲明ArrayList對象時並不需要指定它的長度。

2、示例

//ArrayList
ArrayList list = new ArrayList();
//新增數據
list.Add("world");
list.Add(5678); 
//修改數據
list[2] = 34;
//移除數據
list.RemoveAt(0); 
//插入數據
list.Insert(0, "hello");

3、反思

從上面這個例子,我們大家可以看出,它解決了數組中的所有缺點。它實現了存儲的數據動態擴充與收縮,故我們不用指定長度。

但是同時它又暴露了一個問題,通過上面的例子,我們不難發現:我們可以將任何類型的數據添加到ArrayList中。這是因爲,它會把所有插入其中的數據當作爲object類型來處理。我們大家都知道object是所有類型的父類,我們在存取這些數據時,註定要經過繁瑣的數據類型的轉換,而這些過程,對於我們的數組來說,會造成類型不安全的問題隱患,同時它更會帶來了很大的性能消耗。

那麼爲了解決這些問題,泛型List出現了。

三、泛型List

1、概念

首先我們要知道,泛型List是ArrayList類的泛型等效類。它的大部分用法都與ArrayList相似,因爲List類也繼承了IList接口。最關鍵的區別在於,在聲明List集合時,我們同時需要爲其聲明List集合內數據的對象類型。詳情請見本人另一篇博文:C#中List泛型用法,必知必會!

2、示例

List<int> list = new List<int>();
//新增數據
list.Add(123);
//修改數據
list[0] = 345;
//移除數據
list.RemoveAt(0);

3、反思

在上例中,如果我們往List集合中插入string字符"hello world",IDE就會報錯,且不能通過編譯。這是因爲我們已經規定了這個List集合是int類型的,此時我們將無法插入其他數據類型。

四、對比總結

  • 數組的容量是固定的,我們只能一次獲取或設置一個元素的值,而ArrayList或泛型List的容量可根據需要自動擴充、修改、刪除或插入數據。
  • 數組可以具有多個維度,而 ArrayList或泛型List始終只具有一個維度,但是我們可以輕鬆創建數組列表或列表的列表。
  • 在決定使用泛型List還是使用ArrayList 類(兩者具有類似的功能)時,記住泛型List類在大多數情況下執行得更好並且類型安全。如果對泛型List類的類型使用object類型時,則兩個類的行爲是完全相同的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章