|
|
|
|
|
在C#中,ArrayList
、List
都能夠存儲(chǔ)一組對(duì)象,但它們是有區(qū)別的,微軟官方甚至建議使用List
而不是ArryList
,這是本文要說的重點(diǎn),List
對(duì)比ArrayList
有哪些優(yōu)勢(shì)呢?
在了解List
對(duì)比ArrayList
有哪些優(yōu)勢(shì)之前,我們先來看看ArrayList
、List
的區(qū)別。
ArrayList
ArrayList
處于System.Collections
命名空間下,如果需要使用需要引入。同時(shí)繼承了IList
接口,提供了數(shù)據(jù)檢索和存儲(chǔ)。ArrayList
對(duì)象的大小是按照其中存儲(chǔ)的數(shù)據(jù)來動(dòng)態(tài)擴(kuò)充與收縮的。所以,在聲明ArrayList
對(duì)象時(shí)并不需要指定它的長(zhǎng)度。
ArrayList foo = new ArrayList();
// 增加
foo.Add("Hello");
foo.Add("World");
// 刪除
foo.RemoveAt("0");
// 修改
foo[0] = "hello";
// 插入數(shù)據(jù)
foo.Insert(0, " ");
如此來看,ArrayList
解決了所有數(shù)組的痛點(diǎn),那為什么還要有List呢?
我們?nèi)绻⒁庥^察,會(huì)發(fā)現(xiàn),foo.Add
這個(gè)方法參數(shù)類型是Object,也就是說我們可以給ArrayList
添加任意類型的數(shù)據(jù),如果我們使用不慎,會(huì)發(fā)生類型不匹配異常,也就是說ArrayList
是不安全類型。在存儲(chǔ)或檢索值類型時(shí)通常發(fā)生裝箱和取消裝箱操作,帶來很大的性能耗損。我們總結(jié)一下Arrayist
的缺點(diǎn):
List
因?yàn)?code>ArrayList存在不安全類型與裝箱拆箱的缺點(diǎn),所以出現(xiàn)了泛型的概念。List
類是ArrayList
類的泛型等效類,它的大部分用法都與ArrayList
相似,因?yàn)?code>List類也繼承了IList接口。最關(guān)鍵的區(qū)別在于,在聲明List
集合時(shí),我們同時(shí)需要為其聲明List
集合內(nèi)數(shù)據(jù)的對(duì)象類型。
List<string> foo = new List<string>();
// 增加
foo.Add("Hello");
// 修改
foo[0] = "hello";
// 刪除
foo.RemoveAt(0);
上例中,我們可以看到,我們?cè)诼暶鲿r(shí)需要用<Strintg>
形式傳入類型,這樣,我們往List
集合中插入String
數(shù)組Hello
,IDE就會(huì)報(bào)錯(cuò),且不能通過編譯。這樣就避免了前面講的類型安全問題與裝箱拆箱的性能問題了。
為什么選擇使用List,而不是ArryList
下面是官網(wǎng)的相關(guān)建議
重要的
我們不建議您使用該類
ArrayList
進(jìn)行新的開發(fā)。相反,我們建議您使用通用的List<T>
類。ArrayList
類旨在保存異構(gòu)的對(duì)象集合。但是,它并不總是提供最佳性能。相反,我們建議如下:
- 對(duì)于異類對(duì)象集合,請(qǐng)使用
List<Object>
(在 C# 中)或List
(Of Object)(在 Visual Basic 中)類型。- 對(duì)于同類對(duì)象集合,請(qǐng)使用
List<T>
類。有關(guān)這些類的相對(duì)性能的討論,請(qǐng)參閱List<T>
參考主題中的性能注意事項(xiàng)。有關(guān)使用通用而非非通用集合類型的一般信息,請(qǐng)參閱 GitHub 上不應(yīng)使用非通用集合。
跟List
比較,ArrayList
有一個(gè)優(yōu)點(diǎn),就是它可以存儲(chǔ)類型不一樣的對(duì)象數(shù)據(jù),而List
泛型集合類,其中T必須是對(duì)他存儲(chǔ)元素對(duì)象的約束,必須一致性!
ArrayList
存儲(chǔ)的對(duì)象如果是值類型,那就涉及到裝箱操作,這個(gè)對(duì)程序性能影響很大,所以不到萬(wàn)不得已,還是不要用!
而且ArrayList
里面存放元素對(duì)象類型都不一致,在C#(強(qiáng)類型語(yǔ)言)中處理時(shí),還需要判斷,還要涉及到頻繁裝箱拆箱,這對(duì)性能影響很大。
而List
的特點(diǎn)是:只能添加一種數(shù)據(jù)類型,可以是基本的值類型也可以實(shí)引用類型,一旦數(shù)據(jù)類型確定,不可更改!
List
做數(shù)據(jù)處理時(shí),完全可以采用強(qiáng)大的Linq
,處理起來那是相當(dāng)?shù)姆奖恪?/p>
總結(jié)
本文介紹了List
和ArryList
的特點(diǎn)和區(qū)別,以及List
對(duì)比ArrayList
有哪些優(yōu)勢(shì)。
在決定使用List<T>
還是使用ArrayList
類時(shí),記住List<T>
類在大多數(shù)情況下執(zhí)行得更好并且是類型安全的。如果List<T>
對(duì)類的類型T使用引用類型,則兩個(gè)類的行為是完全相同的。但是,如果對(duì)類型T使用值類型,則需要考慮實(shí)現(xiàn)和裝箱問題。
相關(guān)文章