2010-04-20 67 views

回答

9

請勿使用。使用System.Collections.Generic.List<T>

這真的是我的建議。可能與你的應用程序無關,但是這裏有更多的顏色,以防萬一你需要在這裏做一些精心設計的選擇。

ArrayListLinkedListList的存儲機制的不同實現。 ArrayList使用一個數組,它必須調整大小,如果您的集合超過當前存儲大小。 LinkedList使用CS 201的鏈表數據結構。LinkedList更適合某些頭部或尾部插入繁重的工作負載,但ArrayList更適合隨機訪問工作負載。

+0

爲什麼當他明確詢問每個(數組鏈接)是最好的時候,總是使用基於數組的列表? – 2010-04-20 17:23:29

+1

我的觀點是,你通常不必在這裏選擇痛苦。基類庫中有很多地方可以獲得List,無論這是否是您希望得到的結果。 ('* .ToList()')'LinkedList'甚至不實現'IList',所以它不能自動用於很多'List'上下文中。 如果您出於性能方面的原因需要使用LinkedList,那就完全正常了,但平均而言,您的損失將超過您的收益。 – sblom 2010-04-20 17:55:13

+0

沒有人說你應該痛苦。這通常是一個相對簡單的決定。我不明白你爲什麼認爲你必須使用'List'纔是因爲標準庫的特定部分。 「LinkedList」故意不實施「IList」,以儘量減少人們濫用它。即使這是真的,「平均你輸了」,OP沒有問平均。他在每個問題上都詢問了*。 – 2010-04-21 00:11:11

4

的區別在於如何在List接口*被實現的語義:

http://en.wikipedia.org/wiki/Arraylisthttp://en.wikipedia.org/wiki/LinkedList


*含義basic list operations

+1

您可以在這些維基百科文章中查看每項操作的算法複雜性。 – pgb 2010-04-20 17:00:24

+0

這個接口是'IList ',但'LinkedList '沒有實現它(可能故意阻止糟糕的算法)。 – 2010-04-20 17:26:45

+1

'列表'不是接口,'ArrayList'和'LinkedList '都不實現'IList '。 – Lee 2010-04-20 17:28:07

11

的差異被用於將內部數據結構存儲對象。

ArrayList將使用系統數組(如Object[])並在需要時調整其大小。另一方面,LinkedList將使用包含數據的對象和指向列表中下一個和上一個對象的指針。

由於內部表示的差異,不同的操作會有不同的算法複雜性。

2

它們在「插入」(添加新元素)和查找時具有不同的性能。對於插入ArrayLists內部保存一個數組(最初16個項目),當達到最大容量時,它將數組大小加倍。 LinkedList在需要時開始爲空並添加一個項目(節點)。

我認爲,使用ArrayList可以索引項目,而使用LinkedList必須從頭部「訪問」項目(或LinkedList會自動爲您執行此操作)。

+0

LinkedList也有O(1)刪除,而'List '和'ArrayList'平均爲O(n)(除非刪除位於尾部,否則需要複製)。 – 2010-04-20 17:45:22

3

ArrayListList<T>LinkedList<T>,以及其他類似的仿製藥之間的主要區別在於:ArrayList持有Object s左右,而其他人認爲你指定類型(即List<Point>僅保存點)。

因此,您需要將您從ArrayList中取出的任何物體轉換爲其實際類型。如果你有很長的類名,這會佔用大量的屏幕空間。

一般來說,使用List<T>和其他類型的泛型要好得多,除非你真的需要一個包含多種不同類型對象的列表。

7

ArrayList有一個很好的替代品,它是List<T>

一般而言,List<T>爲數組的包裝 - 它允許索引和訪問項O(1),但是,每次超過該容量時間爲O(n)必須支付。

LinkedList<T>不會讓你訪問使用索引項,但你可以指望的是插入總是會花費O(1)。另外,您可以在O(1)中將項目插入列表的開始處和現有項目之間。

我認爲在大多數情況下List<T>是默認選擇。許多常見的方案不需要特殊的訂單,並且沒有嚴格的複雜性約束,因此使用簡便,因此優選List<T>

2

正如@sblom所說的,使用LinkedList和ArrayList的通用對應物。沒有理由不這樣做,並有充足的理由這樣做。

列表<T>實現有效地包裝數組。如果用戶試圖插入超出背襯陣列的邊界的元件,它會被複制到一個較大的陣列(在相當大的費用,BUIT透明到列表的用戶<Ť>)

甲鏈表<Ť>具有完全不同的實現,其中數據保存在LinkedListNode實例中,該實例引用兩個其他LinkedListNode實例(或者在列表的頭部或尾部的情況下僅引用一個)。不會創建對中間列表項目的外部參照。這意味着迭代列表很快,但隨機訪問速度很慢,因爲必須從一端或另一端迭代節點。使用LinkedList的最好理由是允許快速插入,這涉及到簡單地更改節點所持有的引用,而不是重寫整個列表以插入項目(如列表<T>)

相關問題