也許這很愚蠢,但我必須知道答案。我抓着頭看着它的源代碼,並沒有看到爲什麼作者實現Queue
LinkedList
,但決定不要這樣做與ArrayList
相同,而是他們創建了單獨的類ArrayDeque
。爲什麼ArrayList沒有實現隊列?
3
A
回答
3
的interface Queue
要求add
將項添加到Queue
和remove
的端部從Queue
的開始需要的元件。
(僞碼)
Queue<String> q = ...
q.add("A")
q.add("B")
q.add("C")
//q is now [A,B,C]
String a = q.remove()
// a is A and q is [B, C]
現在;與ArrayList
,remove
操作將O(n)
- 我會想象API設計者認爲這種性能是不可接受的。
remove
是O(n)
,因爲它需要重新索引整個列表 - 現在B
是0
和C
現在1
。 LinkedList
沒有這個問題,因爲它使用鏈表數據結構;它只是刪除頭節點並將該節點的子節點設置爲新頭節點。
ArrayDeque
是一個不同的設計,以支持O(1)
- 因此它不是List
。
0
最有可能的,因爲它不會是一個Queue
非常高性能的,因爲增加了(當然,從在Queue
的情況下刪除)開始爲O(N)
操作,而不是O(1)
。另一方面,ArrayDeque
是不同的設計,因爲它不是List
,因此不需要提供隨機訪問。
相關問題
- 1. 將我的隊列實現爲列表有什麼問題?
- 2. 爲什麼Cocoa中沒有隊列?
- 3. 使用ArrayList實現循環隊列
- 4. 爲什麼ArrayList實現使用Object []?
- 5. 爲什麼ArrayList實現IList,ICollection,IEnumerable?
- 6. 爲什麼JsArrayString沒有實現迭代?
- 7. 爲什麼LinkedHashMap沒有實現SortedMap?
- 8. 爲什麼AbstractAction沒有實現actionPerformed()?
- 9. WhereSelectArrayIterator爲什麼沒有實現ICollection?
- 10. 爲什麼AbstractCollection沒有實現equals()?
- 11. 爲什麼java.util.TreeMap.KeySet沒有實現equals?
- 12. 爲什麼要將隊列實現爲循環數組?
- 13. 爲什麼我的隊列沒有出隊?
- 14. 隊列實現爲Array
- 15. 隊列實現
- 16. Java的隊列爲什麼實現集合和可迭代?
- 17. 爲什麼.NET中隊列的底層實現使用數組?
- 18. 有什麼辦法來實現最小/最大隊列?
- 19. 隊列的兩種常見實現之間有什麼區別?
- 20. Java:用一個隊列實現堆棧,有什麼問題?
- 21. 爲什麼Python沒有本地鏈接列表實現?
- 22. 爲什麼從隊列(雙端隊列)
- 23. 什麼時候和爲什麼沒有實現(java.lang.reflect.InvocationTargetException)發生?
- 24. 從隊列轉換爲ArrayList
- 25. PHP隊列實現
- 26. C#隊列實現#
- 27. 隊列實現C++
- 28. jms隊列實現
- 29. ArrayList和隊列
- 30. 隊列有什麼問題?
'ArrayList'早於'Queue'多年和多個版本。一個人不只是因爲一個新的接口存在而簡單地擴展一個類型的契約。特別是當它這樣做有疑問時。 OTID的LinkedList是值得的。 –
@LewBloch這不完全正確。有很多老的類已經被修改,以實現一個更新的界面,這是很有意義的。使用'ArrayList'作爲隊列是可能的,但它不是很聰明。 – Kayaman
是的,就像我剛纔提到的'LinkedList'一樣。 –