C#中的Array,ArrayList和List

Array:數組的基類,數組在內存中是一塊連續的內存地址,在數組聲明時便已經分配了地址,在C語言中,我們想要使用數組的話我們需要使用malloc函數來手動分配內存,這也造成了Array的不便,假如我們要向數組中某個位置插入一個元素,其後面的所有元素都需要進行移位,這勢必造成操作不便,具體是如何移位可以參考點擊此處查看我的這篇文章中關於動態數組的實現(C語言實現)

ArrayList:很少使用的一個類,實際上其是對數組的一個優化與改進,其實現了動態數組,官方的描述是: 使用大小可按需動態增加的數組實現 System.Collections.IList 接口,對於這個IList接口,我們F12進去後發現,裏面有一堆我們熟知的方法:Add,Insert,Remove等,這些我們在List中非常常用,實際上ArrayList最讓人感到有趣的一點在於其存儲元素時我們可以將不同類型的元素全部都放進去,如下列代碼所示:

        ArrayList test =new ArrayList();
        int a=123;
        string st= "123";
        test.Add(a);
        test.Add(st);

此時編譯器並不會報錯,因爲ArrayList類實現的IList接口方法Add()實際上參數是object類型,如下圖所示:
ArryList中的Add()方法這樣做的話有非常有意思了,一個容器中能放多種不同類型的元素,那我們在使用它時很可能造成類型錯誤,說明了其並不是類型安全的,其次我們要取得其裏面的元素或者向其存儲元素時,由於其接收的是一個object類型的元素,取出來也是一個object類型的元素,所以勢必會進行裝箱和拆箱操作,裝箱和拆箱操作會極大地損耗性能,所以我們還是儘量少使用ArrayList爲妙,這裏還有一個有趣的點,ArrayList實際上就是List,沒有聲明類型的List,讓我們來看看java聲明List的做法:

List<T> list=new ArrayList<T>();

C#在編寫的時候是很多是借鑑了java並優化了java,從上面可以看出實際上List就是定義了儲存元素類型後的ArrayList,保證了類型安全,並且不需要進行拆裝箱操作,C#可能爲了語句的優雅,所以重新定義了類List,這樣C#的聲明語句就如下:

  List<T> list = new List<T>();

更有了對稱美,展現了C#的優雅所在。
List:上面其實已經說到了,其的不同點在於其引入了泛型的概念,所以我們固定化了傳入元素類型,保證了線程安全,也去除掉了拆箱與裝箱操作,極大地提高了性能,List也成爲了我們現在使用的最多最廣的數據結構之一。
That’s All.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章