Array
定義:
public abstract class Array:ICloneable, IList, ICollection, IEnumerable, IStructuralComparable, IStructuraEquatable
數(shù)組在內(nèi)存中是連續(xù)存儲(chǔ)的,所以它的索引速度是非常的快,而且賦值與修改元素也很簡單
- string[] s = new string[3];
- //賦值
- s [0] = "a";
- s [1] = "b";
- s [2] = "c";
- //修改
- s [0] = "a1";
數(shù)組在倆數(shù)據(jù)中插入數(shù)據(jù)是很麻煩的,還有我們?cè)诼暶鲾?shù)組的時(shí)候,必須同時(shí)指明數(shù)組的長度,數(shù)組的長度過長,會(huì)造成內(nèi)存浪費(fèi),數(shù)組和長度過短,會(huì)造成數(shù)據(jù)溢出的錯(cuò)誤。
ArrayList
ArrayList是.Net Framework提供的用于數(shù)據(jù)存儲(chǔ)和檢索的專用類,它是命名空間System.Collections下的一部分。它的大小是按照其中存儲(chǔ)的數(shù)據(jù)來動(dòng)態(tài)擴(kuò)充與收縮的。所以,我們?cè)诼暶鰽rrayList對(duì)象時(shí)并不需要指定它的長度。ArrayList繼承了IList接口,所以它可以很方便的進(jìn)行數(shù)據(jù)的添加,插入和移除.比如:
- ArrayList list = new ArrayList ();
- //新增數(shù)據(jù)
- list.Add ("abc");
- list.Add (123);
- //修改數(shù)據(jù)
- list [2] = 345;
- //移除數(shù)據(jù)
- list.RemoveAt (0);
- //插入數(shù)據(jù)
- list.Insert (0, "hello world");
ArrayList存在不安全類型與裝箱拆箱的缺點(diǎn):
在list中,我們不僅插入了字符串"abc",而且又插入了數(shù)字123。這樣在ArrayList中插入不同類型的數(shù)據(jù)是允許的。因?yàn)锳rrayList會(huì)把所有插入其中的數(shù)據(jù)都當(dāng)作為object類型來處理。這樣,在我們使用ArrayList中的數(shù)據(jù)來處理問題的時(shí)候,很可能會(huì)報(bào)類型不匹配的錯(cuò)誤,也就是說ArrayList不是類型安全的。既使我們保證在插入數(shù)據(jù)的時(shí)候都很小心,都有插入了同一類型的數(shù)據(jù),但在使用的時(shí)候,我們也需要將它們轉(zhuǎn)化為對(duì)應(yīng)的原類型來處理。這就存在了裝箱與拆箱的操作,會(huì)帶來很大的性能損耗。
List
List類是ArrayList類的泛型等效類(ArrayList繼承了List接口)。它的大部分用法都與ArrayList相似,因?yàn)長ist類也繼承了IList接口。最關(guān)鍵的區(qū)別在于,在聲明List集合時(shí),我們同時(shí)需要為其聲明List集合內(nèi)數(shù)據(jù)的對(duì)象類型。
- List<int> list = new List<int>();
- //新增數(shù)據(jù)
- list.Add(123);
- //修改數(shù)據(jù)
- list[0] = 345;
- //移除數(shù)據(jù)
- list.RemoveAt(0);
拓展
ArrayList list1 = new ArrayList ();
這句創(chuàng)建了一個(gè)ArrayList的對(duì)象后把上溯到了List。此時(shí)list是一個(gè)List對(duì)象了,有些ArrayList有但是List沒有的屬性和方法,它就不能再用了。而ArrayList list=new ArrayList();創(chuàng)建一對(duì)象則保留了ArrayList的所有屬性。
問題就在于List有多個(gè)實(shí)現(xiàn)類,如LinkedList或者Vector等等,現(xiàn)在你用的是ArrayList,也許哪一天你需要換成其它的實(shí)現(xiàn)類呢?,這時(shí)你只要改變這一行就行了:List list = new LinkedList(); 其它使用了list地方的代碼根本不需要改動(dòng)。假設(shè)你開始用 ArrayList list = new ArrayList(), 這下你有的改了,特別是如果你使用了 ArrayList特有的方法和屬性。如果沒有特別需求的話,最好使用List list = new LinkedList(); 便于程序代碼的重構(gòu). 這就是面向接口編程的好處。




