數組和List區別

ArrayList都屬於順序表。 因爲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需要使用mscorlibListget_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

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