C# ArrayList類的用法
ArrayList通俗的理解,就是能建立動態陣列,不需要初始化其大小。
- 這個類有三個建構函式:
一 : public ArrayList()
初始化 ArrayList類的新例項,該例項為空並且具有預設初始容量。
二:public ArrayList(ICollection)
初始化 ArrayList類的新例項,該例項包含從指定集合複製的元素並且具有與所複製的元素數相同的初始容量。
三:Public ArrayList(Int32)
初始化 ArrayList類的新例項,該例項為空並且具有指定的初始容量。
- ArrayList的幾個重要屬性:
Count:獲取ArrayList 中實際包含的元素數。
Capacity:獲取或設定 ArryList可包含的元素數。
IsFixedSize:獲取一個值,該值指示 ArrayList是否具有固定大小。
IsReadOnly:獲取一個值,該值指示 ArrayList 是否為只讀。
Item:獲取或設定指定索引處的元素。
- ArrayList的一些重要方法:
Add、AddRange、Remove、RemoveAt、RemoveRange、Insert、InsertRange
這幾個方法比較類似
Add方法用於新增一個元素到當前列表的末尾
AddRange方法用於新增一批元素到當前列表的末尾
Remove方法用於刪除一個元素,通過元素本身的引用來刪除
RemoveAt方法用於刪除一個元素,通過索引值來刪除
RemoveRange用於刪除一批元素,通過指定開始的索引和刪除的數量來刪除
Insert用於新增一個元素到指定位置,列表後面的元素依次往後移動
InsertRange用於從指定位置開始新增一批元素,列表後面的元素依次往後移動
另外,還有幾個類似的方法:
Clear方法用於清除現有所有的元素
Contains方法用來查詢某個物件在不在列表之中
ToArray:將 ArrayList的元素複製到新陣列中
GetRange:返回 ArrayList,它表示源ArrayList 中元素的子集。
TrimToSize:將容量設定為
ArrayList
ArrayList最佳使用建議:
這一節我們來討論ArrayList與陣列的差別,以及ArrayList的效率問題
(1)ArrayList是Array的複雜版本
ArrayList內部封裝了一個Object型別的陣列,從一般的意義來說,它和陣列沒有本質的差別,甚至於ArrayList的許多方法,如Index、IndexOf、Contains、Sort等都是在內部陣列的基礎上直接呼叫Array的對應方法。
(2)內部的Object型別的影響
對於一般的引用型別來說,這部分的影響不是很大,但是對於值型別來說,往ArrayList裡面新增和修改元素,都會引起裝箱和拆箱的操作,頻繁的操作可能會影響一部分效率。
但是恰恰對於大多數人,多數的應用都是使用值型別的陣列。
消除這個影響是沒有辦法的,除非你不用它,否則就要承擔一部分的效率損失,不過這部分的損失不會很大。
(3)陣列擴容
這是對ArrayList效率影響比較大的一個因素。
每當執行Add、AddRange、Insert、InsertRange等新增元素的方法,都會檢查內部陣列的容量是否不夠了,如果是,它就會以當前容量的兩倍來重新構建一個數組,將舊元素Copy到新陣列中,然後丟棄舊陣列,在這個臨界點的擴容操作,應該來說是比較影響效率的。
例1:比如,一個可能有200個元素的資料動態新增到一個以預設16個元素大小建立的ArrayList中,將會經過:
16*2*2*2*2 = 256
四次的擴容才會滿足最終的要求,那麼如果一開始就以:
ArrayList List = new ArrayList( 210);
的方式建立ArrayList,不僅會減少4次陣列建立和Copy的操作,還會減少記憶體使用。
例2:預計有30個元素而建立了一個ArrayList:
ArrayList List = new ArrayList(30);
在執行過程中,加入了31個元素,那麼陣列會擴充到60個元素的大小,而這時候不會有新的元素再增加進來,而且有沒有呼叫TrimSize方法,那麼就有1次擴容的操作,並且浪費了29個元素大小的空間。如果這時候,用:
ArrayList List = new ArrayList(40);
那麼一切都解決了。
所以說,正確的預估可能的元素,並且在適當的時候呼叫TrimSize方法是提高ArrayList使用效率的重要途徑。
(4)頻繁的呼叫IndexOf、Contains等方法(Sort、BinarySearch等方法經過優化,不在此列)引起的效率損失
首先,我們要明確一點,ArrayList是動態陣列,它不包括通過Key或者Value快速訪問的演算法,所以實際上呼叫IndexOf、Contains等方法是執行的簡單的迴圈來查詢元素,所以頻繁的呼叫此類方法並不比你自己寫迴圈並且稍作優化來的快,如果有這方面的要求,建議使用Hashtable或SortedList等鍵值對的集合。
Add | 將物件新增到 ArrayList 的結尾處。 | |
已過載。 使用對分檢索演算法在已排序的 ArrayList 或它的一部分中查詢特定元素。 | ||
Clear | 從 ArrayList 中移除所有元素。 | |
Clone | 建立 ArrayList 的淺表副本。 | |
確定某元素是否在 ArrayList 中。 | ||
已過載。 將 ArrayList 或它的一部分複製到一維陣列中。 | ||
已過載。 返回具有固定大小的列表包裝,其中的元素允許修改,但不允許新增或移除。 | ||
已過載。 返回迴圈訪問 ArrayList 的列舉數。 | ||
返回 ArrayList,它表示源 ArrayList 中元素的子集。 | ||
已過載。 返回 ArrayList 或它的一部分中某個值的第一個匹配項的從零開始的索引。 | ||
將元素插入 ArrayList 的指定索引處。 | ||
將集合中的某個元素插入 ArrayList 的指定索引處。 | ||
已過載。 返回 ArrayList 或它的一部分中某個值的最後一個匹配項的從零開始的索引。 | ||
已過載。 返回只讀的列表包裝。 | ||
從 ArrayList 中移除特定物件的第一個匹配項。 | ||
移除 ArrayList 的指定索引處的元素。 | ||
從 ArrayList 中移除一定範圍的元素。 | ||
返回 ArrayList,它的元素是指定值的副本。 | ||
已過載。 將 ArrayList 或它的一部分中元素的順序反轉。 | ||
將集合中的元素複製到 ArrayList 中一定範圍的元素上。 | ||
Sort | 已過載。 對 ArrayList 或它的一部分中的元素進行排序。 | |
已過載。 返回同步的(執行緒安全)列表包裝。 | ||
已過載。 將 ArrayList 的元素複製到新陣列中。 | ||
將容量設定為 ArrayList 中元素的實際數目。 |