2012-08-04 70 views
5

它在內部被視爲一個數組或被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 <>。

+2

你可以試試[ILSpy](http://ilspy.net)並自己看看。具有動態可擴展/可收縮列表的原因是它不是像'Array'那樣的固定大小。 – 2012-08-04 09:47:00

回答

5

List<>是一個數據結構的實現,它負責按需分配內存;它允許在任何索引處插入和刪除等,因此它比簡單的數組更方便。

在引擎蓋下,目前的List<>實現使用一個數組進行存儲,並且在進行類似數組操作時的開銷很小。增加的便利性通常值得一點(如果相關的話)性能差異。添加項目通常更快,因爲列表分配內存塊,並且不需要每次添加都有新的分配和複製(與純數組相比,Length始終與內存中的大小綁定在一起)。

+0

所以,你說的是,儘管可以忽略不計,'List <>'將提供一個較慢的響應,就_Speed_而言,而不是'Array'? – 2012-08-04 10:04:52

+2

當然。列表是一個數組抽象概念,並且抽象會花費額外的CPU週期。不過,在正常情況下,我同意Lucero的觀點,List的速度還不夠快。 – Steven 2012-08-04 10:09:37

+2

「響應時間」通常是不相關的,請求會在(快速且便宜的)邊界檢查之後傳遞到底層數組。這可能甚至會被運行時內聯,所以它甚至不需要額外的調用。 – Lucero 2012-08-04 10:29:57

1

正常的隨機訪問列表通常有一個內部數組。 .NET List<T>執行此操作。其他實現,如LinkedList<T>使用元素鏈而不是數組。更奇特的列表可能會在內部使用樹來進行排序。

List<T>中的內部數組初始化的長度很短(4我相信),並且如果嘗試在數組的最大範圍外進行添加,它將被展開。由於這可能非常耗時(需要複製數組),因此數組的大小加倍,即添加第5個元素時,內部數組的大小調整爲8,依此類推。

+0

我記得讀過,'List <>'數據結構針對_Speed_進行了優化,而'Array' DS針對_Memory_進行了優化。你似乎違背了'List <>'爲_Speed_優化的事實。 (當我們說它被重新調整大小和重新分配,當移出界限時) – 2012-08-04 10:01:10

+0

我不同意這種區別。列表內部有一個數組,因此與數組存儲方式基本上沒有區別。你用清單付出了很小的性能損失,並且爲此付出了一個動態/可調整大小的集合。所以總之,列表和數組之間最大的不同之處在於,你總是可以將東西添加到列表中。 – 2012-08-04 10:05:23

+1

@bugbuster,如果你想添加一個項目到一個數組(這樣'Length'增加,也就是說,不僅僅是改變現有項目),你也必須重新分配數組。該列表將以更大的塊形式生長,並跟蹤數組中使用的元素的數量,因此對於順序添加而言,速度更快。 – Lucero 2012-08-04 10:27:29