LinkedList
和ArrayList
有什麼區別?我如何知道何時使用哪一個?LinkedList和ArrayList之間有什麼區別,以及何時使用哪一個?
回答
請勿使用。使用System.Collections.Generic.List<T>
。
這真的是我的建議。可能與你的應用程序無關,但是這裏有更多的顏色,以防萬一你需要在這裏做一些精心設計的選擇。
ArrayList
和LinkedList
是List
的存儲機制的不同實現。 ArrayList
使用一個數組,它必須調整大小,如果您的集合超過當前存儲大小。 LinkedList
使用CS 201的鏈表數據結構。LinkedList
更適合某些頭部或尾部插入繁重的工作負載,但ArrayList
更適合隨機訪問工作負載。
爲什麼當他明確詢問每個(數組鏈接)是最好的時候,總是使用基於數組的列表? – 2010-04-20 17:23:29
我的觀點是,你通常不必在這裏選擇痛苦。基類庫中有很多地方可以獲得List,無論這是否是您希望得到的結果。 ('* .ToList()')'LinkedList'甚至不實現'IList',所以它不能自動用於很多'List'上下文中。 如果您出於性能方面的原因需要使用LinkedList,那就完全正常了,但平均而言,您的損失將超過您的收益。 – sblom 2010-04-20 17:55:13
沒有人說你應該痛苦。這通常是一個相對簡單的決定。我不明白你爲什麼認爲你必須使用'List'纔是因爲標準庫的特定部分。 「LinkedList」故意不實施「IList」,以儘量減少人們濫用它。即使這是真的,「平均你輸了」,OP沒有問平均。他在每個問題上都詢問了*。 – 2010-04-21 00:11:11
的區別在於如何在List
接口*被實現的語義:
http://en.wikipedia.org/wiki/Arraylist和http://en.wikipedia.org/wiki/LinkedList
的差異被用於將內部數據結構存儲對象。
ArrayList
將使用系統數組(如Object[]
)並在需要時調整其大小。另一方面,LinkedList
將使用包含數據的對象和指向列表中下一個和上一個對象的指針。
由於內部表示的差異,不同的操作會有不同的算法複雜性。
它們在「插入」(添加新元素)和查找時具有不同的性能。對於插入ArrayLists內部保存一個數組(最初16個項目),當達到最大容量時,它將數組大小加倍。 LinkedList在需要時開始爲空並添加一個項目(節點)。
我認爲,使用ArrayList可以索引項目,而使用LinkedList必須從頭部「訪問」項目(或LinkedList會自動爲您執行此操作)。
LinkedList也有O(1)刪除,而'List
ArrayList
和List<T>
,LinkedList<T>
,以及其他類似的仿製藥之間的主要區別在於:ArrayList
持有Object
s左右,而其他人認爲你指定類型(即List<Point>
僅保存點)。
因此,您需要將您從ArrayList
中取出的任何物體轉換爲其實際類型。如果你有很長的類名,這會佔用大量的屏幕空間。
一般來說,使用List<T>
和其他類型的泛型要好得多,除非你真的需要一個包含多種不同類型對象的列表。
ArrayList
有一個很好的替代品,它是List<T>
。
一般而言,List<T>
爲數組的包裝 - 它允許索引和訪問項O(1),但是,每次超過該容量時間爲O(n)必須支付。
LinkedList<T>
不會讓你訪問使用索引項,但你可以指望的是插入總是會花費O(1)。另外,您可以在O(1)中將項目插入列表的開始處和現有項目之間。
我認爲在大多數情況下List<T>
是默認選擇。許多常見的方案不需要特殊的訂單,並且沒有嚴格的複雜性約束,因此使用簡便,因此優選List<T>
。
正如@sblom所說的,使用LinkedList和ArrayList的通用對應物。沒有理由不這樣做,並有充足的理由這樣做。
列表<T>實現有效地包裝數組。如果用戶試圖插入超出背襯陣列的邊界的元件,它會被複制到一個較大的陣列(在相當大的費用,BUIT透明到列表的用戶<Ť>)
甲鏈表<Ť>具有完全不同的實現,其中數據保存在LinkedListNode實例中,該實例引用兩個其他LinkedListNode實例(或者在列表的頭部或尾部的情況下僅引用一個)。不會創建對中間列表項目的外部參照。這意味着迭代列表很快,但隨機訪問速度很慢,因爲必須從一端或另一端迭代節點。使用LinkedList的最好理由是允許快速插入,這涉及到簡單地更改節點所持有的引用,而不是重寫整個列表以插入項目(如列表<T>)
- 1. Python:os.remove()和os.unlink()之間的區別以及使用哪一個?
- 2. DisplayDataMember和ItemTemplate之間的區別是什麼以及何時使用另一個?
- 3. 在LinkedList中,list.add(...)和object.list.add(...)之間有什麼區別?
- 4. self.view.frame和self.superview.frame之間有什麼區別以及如何使用它們?
- 5. read()和recv()之間以及send()和write()之間有什麼區別?
- 6. 什麼時候使用List以及何時使用ArrayList,也是Java中的LinkedList?
- 7. 只有一個參數時,$ @和$ 1之間有什麼區別?
- 8. std :: vector和LLVM :: SmallVector之間的區別是什麼?哪一個使用時?
- 9. Selenium Webdriver和angular e2e之間有什麼區別,以及每個應該在什麼時候使用?
- 10. 什麼時候使用以及C++中clog和cerr之間的區別
- 11. configure.ac和configure.in以及Makefile.am和Makefile.in之間的區別是什麼?
- 12. dispatch_time和dispatch_walltime之間有什麼區別,以及在哪些情況下最好使用其中一種?
- 13. Corona sdk:audio.play()和media.play()之間有什麼區別,哪個更好?
- 14. iterator和iterable之間的區別是什麼以及如何使用它們?
- 15. Array和ArrayList之間有什麼區別來獲得素數?
- 16. Array,ArrayList和List之間有什麼區別?
- 17. can.fixture和can.observe之間有什麼區別,它們在哪裏可以使用?
- 18. Queue q = new LinkedList和LinkedList q = new LinkedList之間的區別?
- 19. 使用PyCharm重構時,Remove和Exclude之間有什麼區別?
- 20. moveBackward和moveLeft之間有什麼區別:使用NSResponder -interpretKeyEvents時:?
- 21. 使用過濾器時{}和()之間有什麼區別?
- 22. 使用auto_ptr時,* ptr和* ptr.get()之間有什麼區別?
- 23. 使用Mockito時,mock()和stub()之間有什麼區別?
- 24. 如何在Java中解析JSON以及JSONObect和JSONArray之間有什麼區別?
- 25. sqlite中query()和rawQuery()之間有什麼區別,哪一個更有效,goog
- 26. NSTextField和NSTextFieldCell有什麼區別,以及我綁定了哪些區別?
- 27. AsyncTask和Handlers之間有什麼區別,哪個更適合在Listview中使用?
- 28. 「層」和「層」之間有什麼區別?
- 29. Tableau和QlikView之間有什麼區別
- 30. Microsoft.CompilerServices.AsyncTargetingPack和Microsoft.Bcl.Async之間有什麼區別?
簡單對於ArrayList,從來沒有。使用通用集合'IList'和相關的。 –
2010-04-20 17:13:38