Array
和List
都屬於順序表。 因爲Array 長度不可變,所以有了List。
存儲結構
1、Array
Array是一段連續的存儲結構
int[] array = new int[3]
array
其實記錄的是數組的首地址,而array[1]
其實相當於在i的地址的基礎上加上1個整數的地址偏移,然後再取這塊地址中的值。
2、List
List
是不連續的存儲結構,List
的每個節點都有着一個Next
屬性,這個屬性則記錄着他的下一個節點的地址。
也就是說當我們想找第100個節點的時候,他還是需要從第一個節點,然後做99次Next操作,才能找到list[99]節點。
3、在查找一個元素時時分別生成以下IL碼
Array:
IL_0020: ldloc.0
IL_0021: ldc.i4.3
IL_0022: ldelem.i4
IL_0023: stloc.2
List:
IL_0022: ldloc.0
IL_0023: ldc.i4.3
IL_0024: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<int32>::get_Item(int32)
IL_0029: stloc.2
通過這兩段IL,我們可以看到List
需要使用mscorlib
對List
的get_Item
方法。因爲List是一個鏈表,所以我需要從第一個元素開始逐個Next到所需索引的元素。這是一個耗時的過程。
空間擴展
數組必須要在初始化時分配固定的大小,比如說int[] a=new int[3];
如果我們僅僅寫int[] a=new int[];
編譯器就會無情地給我們報錯。但是List
由於空間不必連續,所以無須指定初始大小。
存儲內容
Array
數組可以包含基本類型和對象類型,
ArrayList
卻只能包含對象類型。 但是需要注意的是:Array
數組在存放的時候一定是同種類型的元素。ArrayList
就不一定了,因爲ArrayList
可以存儲Object
。
適用場景
如果想要保存一些在整個程序運行期間都會存在而且不變的數據,我們可以將它們放進一個全局數組裏,但是如果我們單純只是想要以數組的形式保存數據,而不對數據進行增加等操作,只是方便我們進行查找的話,那麼,我們就選擇ArrayList。而且還有一個地方是必須知道的,就是如果我們需要對元素進行頻繁的移動或刪除,或者是處理的是超大量的數據,那麼,使用ArrayList就真的不是一個好的選擇,因爲它的效率很低,使用數組進行這樣的動作就很麻煩,那麼,我們可以考慮選擇LinkedList。
參考:
https://zhidao.baidu.com/question/2143832349386743788.html