C 非泛型集合類 ArrayList陣列擴容

2021-09-08 08:42:26 字數 794 閱讀 1203

這是對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使用效率的重要途徑。

trimsize方法

這個方法用於將arraylist固定到實際元素的大小,當動態陣列元素確定不在新增的時候,可以呼叫這個方法來釋放空餘的記憶體。

泛型集合,非泛型集合

arraylist 非泛型集合 list 泛型集合 集合跟陣列比較我們更容易理解。陣列 1,長度固定2,資料型別預先宣告 集合 1,長度可變2,資料型別預先宣告的為泛型集合,資料型別不限定為非泛型 arraylist 長度不固定,元素資料型別為object的集合。object類之間或間接為所有類的父...

C 泛型類的集合和非泛型類的集合區別

using system.collections 非泛型類集合的命名空間。非泛型類的集合 不固定資料型別 using system.collections.generic 泛型類集合的命名空間。1 非泛型類的集合和泛型類的集合的區別 前者是不固定資料型別 後者固定資料型別 比如非泛型集合的array...

C 中的非泛型集合和泛型集合

今天學習了c 中的非泛型集合arraylist和泛型集合list 先來看非泛型集合 使用非泛型集合之前注意呼叫system.collections using system using system.collections namespace lesson21 2 清空陣列 a.clear flag...