C#中數組、集合(ArrayList)、泛型集合List<T>、字典(dictionary<TKey,TValue>)全面對比
為什么把這4個東西放在一起來說,因為c#中的這4個對象都是用來存儲數據的集合……。
首先咱們把這4個對象都聲明並實例化一下:
//數組
string[] m_Str = new string[5];
//集合
ArrayList m_AList = new ArrayList();
//泛型集合
List<int> m_List = new List<int>();
//字典
Dictionary<int, string> m_Dt = new Dictionary<int, string>();
大家看看這4個對象放在一起從外觀上有什么異同?
我給大家提個醒,看看他們是不是都有NEW關鍵字,也就是說他們都需要實例化,在說明白點他們都是引用類型(不知道引用類型為何物的也不用特別糾結,以后會專門說說這個區別)。
好了咱們繼續看
//數組
string[] m_Str = new string[5];
m_Str[0] = "a";
m_Str[1] = "a";
m_Str[2] = "a";
1、聲明數組時[]里面有一個數字“5”,對了這就是區別,數組在聲明的時候必須要指定長度。這是因為數組在內存中是連續存儲的,所以它的索引速度非常快,而且賦值與修改元素也很簡單。還有一點就是數組在聲明定義的時候就指定了類型,我們定義的數組的類型是string的,而且因為數組是連續的,這就導致我們想在這個數組的第一個元素和第二個元素之間插隊,插進一個成員是很不方便的。這就導致了我們需要一個數據集合,這個集合可以方便的讓我們對該集合的成員進行add/delete/insert的操作.這就出現了集合(ArrayList)。
2、咱們看第2個對象集合(ArrayList),它在聲明的時候既沒有大小,也沒有類型,這說明啥?說明他的大小是動態的你可以隨意的add/delete/insert 如:
//集合
ArrayList m_AList = new ArrayList();
m_AList.Add("a");
m_AList.Add(10);
m_AList.Add(true);
m_AList.RemoveAt(0);
m_AList.Insert(1, "aa");
大家可能注意到集合ArrayList中Add的成員有字符串、數值、布爾值。這就說明了一個問題,集合中的每一個成員都是Object類型的,它把具體的成員裝箱到object中在加入到自己。如果要是使用集合中的成員,因為成員是object類型的,所以也要拆箱到具體的類型中后再進行操作和使用。這樣就會出現問題:1、消耗性能(頻繁的拆箱和裝箱)2、不安全,比如說上面的集合對象的第一個成員是字符型的,你取出來后和一個數值型的變量進行運算,就會報錯……。那么接下來就又出現了一個對象——泛型集合(List<T>)對象。
3、泛型集合list<T>對象,大家可能一看見這個就蒙了,反正我一開始看見是蒙了,尖括號是啥,T是啥?別慌,其實不難,尖括號就是一種語法,至於T可以理解成占位符,它可以是string、int、bool……等。咱們看看代碼的用法:
//泛型集合
List<int> m_List = new List<int>();
m_List.Add(10);
m_List.Add(10);
m_List.Add(10);
m_List.RemoveAt(0);
m_List.Insert(1,12);
看起來好像和集合(ArrayList)的用法差不多,其實就是差不多了,哈哈。唯一的區別在於在聲明泛型集合(List<T>)的時候需要制定里面成員的類型,上面的反省集合我們制定的類型是int的,這就是說你添加的成員必須也是int的,這會有啥好處?1.數據安全了,你添加string等非int類型的成員添加不進去(編譯都過不去),這樣數據就安全唯一了,2.節省的性能,不需要每一操作成員的時候都要拆箱和裝箱了。
泛型集合相比集合就相對完美了……
4、最后咱們說說字典Dictionary<TKey, TValue>,大家一看又蒙了,別慌,想想剛才的泛型集合(List<T>)
一樣的,尖括號還是語法,你遵循就好了。而這一次的占位符不是T了,“因為第一個是索引,第二個是具體的值內容,”索引占位符變成額TKey, TValue。就這么簡單呢。
下面咱們看看語法:
//字典
Dictionary<int, string> m_Dt = new Dictionary<int, string>();
m_Dt.Add(0, "a");
m_Dt.Add(1, "b");
m_Dt.Add(0, "c");
string str=m_Dt[0];
看着用法還是比較簡單的吧,拿m_Dt.Add(0, "a");這一句來說0是該字典的【索引】,【值】是字符串a。要根據字典的【索引】找到具體的【值】,語法就是m_Dt[0];這樣就取到了字符串a.
大家回憶一下:因為數組的使用不方便,所以有了集合(ArrayList)。因為集合(ArrayList)的不安全和消耗性能所以有了泛型集合(list<T>).這就是這3者的關系——彌補缺點。至於字典這個因為它也是儲蓄一組數據的集合,同時用到了泛型的東西,所以放在一起來說了。
好了這常見的4個儲存一組數據的對象咱們就講完了,下一章引用類型和值類型咱們見。
可愛的小達…