1.內部實現
List實際是通過數組來實現的,而不是鏈表。並且沒設定初始容量的情況下,初始容量默認為0。
2.擴容
每次容量不夠時,數組容量會擴充一倍。按照4、8、16、32、64、128、256……遞增。
按照2的指數進行擴容可以為GC減少負擔。
每次擴容時,都會new一個新的數組,並拋棄舊數組,造成內存垃圾,為GC帶來負擔。
因此我們最好可以在創建List時,指定一個數組範圍,避免擴容所帶來的GC消耗。
3.Add、Remove、Insert
Add:會檢測List容量是否需要擴容,併為對應的數組元素賦值。
Remove:通過IndexOf找到元素標號,在調用RemoveAt,通過標號刪除元素。
刪除過程實際上是通過Array.Copy對數組進行覆蓋。
Insert:同Add一樣,檢測是否需要擴容,再通過複製數組的形式,將標號之後的元素都向後移動一個位置。
4.其它接口
(1)[]:直接使用數組索引方式調用。
(2)Clear:不刪除數組,只對數組中元素設置0或者Null,並設置表示size的參數為0。
(3)Constant:for循環線性查找。
(4)ToArray:創建一個新數組,用於複製後的返回結果。頻繁使用會會造成大量的內存分配。
(5)Find:for循環的線性查找。
(6)Enumerator:.Net4.0之前會產生大量的垃圾對象(Enumerator實例),4.0之後已修復此問題。
(7)Sort:使用快速排序進行排序,時間複雜度為O(nlgn)。
5.總結
List的效率不高,只是實用性強,可以對線性算法和內存分配方式進行優化。
在使用時儘量避免擴容等操作,頻繁創建數組。
並且List時線程不安全的,在多線程中使用要加鎖。
————————————————
版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
原文鏈接:https://blog.csdn.net/boyZhenGui/article/details/140463944