1. 程式人生 > >C#中集合與陣列的區別

C#中集合與陣列的區別

                    【前言】剛開始學習的時候沒有仔細去思考,然後這些內容在我腦海中就沒有什麼    印象,問問自己這些有什麼區別也只能籠統的說出一點兒來,所以學習還是要做到顆    粒歸倉的,及時總結是很重要的呀。

   陣列:陣列是相同資料型別的元素按一定順序排列的集合。

   優點:陣列在記憶體中是連續儲存的,所以可以快速而且容易的從頭到尾遍歷元素。對於陣列賦值以及修改陣列中的值也是非常簡單的。

   缺點:但是陣列有一個很大的不足就是,在宣告陣列的時候必須宣告指定長度的陣列,所以陣列適合於實現已經確定的資料數量的情況。否則就可能會造成宣告的長度過長導致記憶體空間浪費,過段則造成資料的溢位。而且再兩個資料中間插入資料也是非常麻煩的,需要將插入位置後面的陣列全都移動位置。

   為了克服這些缺點,就引出了集合的概念。在.NET Framework中提供了用於資料儲存和檢索的專用類,這些類統稱為集合。

   1.ArrayList它是使用大小可按需動態增加的陣列實現IList介面(定義了很多集合使用的方法)。所以ArrayList的初始容量為0,隨著元素新增進來,容量就會根據需要重新分配。

   優點:ArrayList可以根據使用大小按需動態增加,不用事先設定其大小的控制,還可以隨意地新增、插入或移除某一範圍元素,比陣列要方便。

   缺點:但是ArrayList不是型別安全的,它把插入值型別的資料都當做object型別,當呼叫資料的時候就可能會出現型別不匹配的錯誤。所以

ArrayList存放值型別的資料時就需要進行裝箱拆箱的操作,但是這項操作需要進行大量的計算也就帶來了很大的效能損耗。

using System.Collections;//增加名稱空間
public partial class Form1:Form
{
     IList arrayAnimal;
     //動物報名按鈕事件
     private void button3_Click(object sender,EventArgs e)
        arrayAnimal=new ArrayList();
        arrayAnimal.Add(new Cat("喵喵"));
        arrayAnimal.Add(new Cat("咪咪"));
        arrayAnimal.RemoveAt(1);//喵喵退出
}

    裝箱:把值型別打包到object引用型別的一個例項中。

//整型變數i被裝箱並複製給物件o
int i=123;
object o=(object) i;

    拆箱:從物件中提取值型別。

//物件O拆箱並將其賦值給整型變數i
o=123;
i=(int)o;

   由於ArrayList存在的問題,C#2.0版之後退出了新的技術來解決這些問題——泛型。

    2.List:泛型是具有佔位符(型別引數)的類、結構、介面和方法,這些佔位符是類、結構、介面和方法所儲存或使用的一個或多個型別的佔位符。泛型集合類可以將型別引數用作他所儲存的物件的佔位符;型別引數作為其欄位的型別和其方法的引數型別出現。

說白了就是在IListList後面添加了<T>T就是需要指定的集合的資料或物件型別。

using System.Collections.Generic;//增加名稱空間
public partial class Form1:Form
{
//此集合型別只接受Animal型別的資料
     IList<Animal> arrayAnimal;
     //動物報名按鈕事件
     private void button3_Click(object sender,EventArgs e)
        arrayAnimal=new List<Animal>();
        arrayAnimal.Add(new Cat("喵喵"));
        arrayAnimal.Add(new Cat("咪咪"));
       
}

    3.HashTable

是一種資料結構,通過鍵(key)和值(value)來組織的。訪問HashTable元素是可以通過鍵名來獲取具體值,但是由於值型別也被轉化為object型別,所以得到一個值型別時也需要轉化,進行拆箱裝箱操作。

    4.泛型集合(Dictionary<K,V>

具有泛型的全部特性,儲存資料的方式和HashTable類似,通過鍵和值儲存元素的。它在編譯時需要檢查型別的約束,獲取元素是無需型別轉換,所以在讀取值型別資料的時候就不需要進行裝箱、拆箱的操作。

   【總結】對於上述的陣列和集合各有優劣,可以按照實際情況選擇合適的應用,但是在實際應用中還是泛型使用的比較廣泛,對於泛型的瞭解只是一個皮毛,需要在以後的應用過程中再去探索它的奧祕。

這篇總結只是小編對於陣列和集合的一些簡單理解,可以存在錯誤歡迎大家指正交流!