它在內部被視爲一個數組或被CLR視爲完全不同的類型嗎?列表<T>如何內部映射?
我想實現整數值的列表。
List<int> lst = new List<int>();
lst.Add(3);
lst.Add(4);
與
創建整數
int[] arr = new int[2];
arr[0] = 3;
arr[1] = 4;
陣列返回更好的時間跨度結果的數組。那麼爲什麼人們更喜歡List <>。
它在內部被視爲一個數組或被CLR視爲完全不同的類型嗎?列表<T>如何內部映射?
我想實現整數值的列表。
List<int> lst = new List<int>();
lst.Add(3);
lst.Add(4);
與
創建整數
int[] arr = new int[2];
arr[0] = 3;
arr[1] = 4;
陣列返回更好的時間跨度結果的數組。那麼爲什麼人們更喜歡List <>。
List<>
是一個數據結構的實現,它負責按需分配內存;它允許在任何索引處插入和刪除等,因此它比簡單的數組更方便。
在引擎蓋下,目前的List<>
實現使用一個數組進行存儲,並且在進行類似數組操作時的開銷很小。增加的便利性通常值得一點(如果相關的話)性能差異。添加項目通常更快,因爲列表分配內存塊,並且不需要每次添加都有新的分配和複製(與純數組相比,Length
始終與內存中的大小綁定在一起)。
正常的隨機訪問列表通常有一個內部數組。 .NET List<T>
執行此操作。其他實現,如LinkedList<T>
使用元素鏈而不是數組。更奇特的列表可能會在內部使用樹來進行排序。
List<T>
中的內部數組初始化的長度很短(4我相信),並且如果嘗試在數組的最大範圍外進行添加,它將被展開。由於這可能非常耗時(需要複製數組),因此數組的大小加倍,即添加第5個元素時,內部數組的大小調整爲8,依此類推。
我記得讀過,'List <>'數據結構針對_Speed_進行了優化,而'Array' DS針對_Memory_進行了優化。你似乎違背了'List <>'爲_Speed_優化的事實。 (當我們說它被重新調整大小和重新分配,當移出界限時) – 2012-08-04 10:01:10
我不同意這種區別。列表
@bugbuster,如果你想添加一個項目到一個數組(這樣'Length'增加,也就是說,不僅僅是改變現有項目),你也必須重新分配數組。該列表將以更大的塊形式生長,並跟蹤數組中使用的元素的數量,因此對於順序添加而言,速度更快。 – Lucero 2012-08-04 10:27:29
你可以試試[ILSpy](http://ilspy.net)並自己看看。具有動態可擴展/可收縮列表的原因是它不是像'Array'那樣的固定大小。 – 2012-08-04 09:47:00