在列表上唯一正在執行的操作是非隨機訪問(無刪除,添加或其他tom-foolery)的情況下,建議使用數組,ArrayList,LinkedList還是其他?或者選擇哪個不相關?在應該使用LinkedList和ArrayList之間沒有明顯優勢的情況下?
回答
除了在某些特定情況下(如嵌入式系統),您可能正在使用分層和/或虛擬內存系統。
儘管操作系統或硬件已充分提取了其實現細節,以便它對您而言是透明的,但仍有一些重要考慮因素。
基於數組的實現將在元素之間表現出比獨立鏈接元素更高程度的空間局部性。
http://en.wikipedia.org/wiki/Locality_of_reference
在計算機科學中, 參考,也被稱爲局部性原理 局部性,是 相同的值或相關存儲 位置被頻繁訪問的現象。 參考文獻 有兩種基本類型。時間地點是指在相對較短的時間內使用特定數據和/或 資源的 持續時間。空間局部性是指使用 內的數據元素的相對接近的存儲位置。當數據以線性方式排列和訪問 ,例如遍歷一維數組中的元素時,發生順序局部性,空間局部性的特例。
局部性僅僅是 計算機系統中發生的一種可預測的行爲。其中 表現出的參考 強大的本地系統是不錯的人選性能 通過使用 技術優化,如緩存和 指令預取技術 內存,或像在 處理器的流水線先進分支預測 。
基於此,所有其他的事情都是平等的,我會選擇ArrayList over LinkedList。
我認爲你的問題在某種程度上會自我回答:如果選擇哪一個並不重要,那麼選擇哪一個並不重要;如果它確實很重要,那麼選擇最好的一個。
這是溫和的舌頭,但在沒有細節的情況下,這就是選擇的結果。
如果有幫助,對Java Collections Tutorial似乎建議ArrayList
作爲通用列表實現當沒有任何相關標準:
在每種情況下,一個實現 -
HashSet
,ArrayList
和HashMap
- 顯然是大多數應用程序使用的,其他所有的東西都是平等的。
當然,我見過的第三方代碼(以及我寫的第一方代碼)也採用了這個原則。
如果數據是靜態的,而您只是在查找,請使用數組。如果你使用ArrayList,你會有一些初始化時間,而LinkedList將有較慢的查找+初始化。
LinkedList其實很漂亮,我只會將它用於只需要順序訪問的大型動態列表。
如果您的列表很小或需要隨機訪問或沒有多少插入和刪除,請使用ArrayList。
從你的問題,這聽起來像你正在做的是迭代通過列表(沒有增加,沒有刪除,沒有隨機查找)。因此,這兩個實現之間應該沒有太大的區別(如您所注意的)。
我能想到的唯一的事情就是創造空間和物體。 ArrayList需要更少的內存來存儲它的數據(數組vs節點:data + next + prev)。因此,我的默認選項是使用ArrayList。
這是我正在尋找的內容:內存差異。謝謝。 –
@farm鴕鳥:如果您想節省更多空間,請使用所需的正確尺寸初始化列表。 –
A LinkedList
將爲鏈接引用增加內存開銷。我不認爲ArrayList
和數組之間沒有太大的區別,如果你使用構造函數來設置ArrayList
的初始容量,所以我傾向於使用ArrayList
,只要我沒有看到明顯的優勢。它的情況,雖然...例如,如果我使用可變參數輸入我可能會保留所有數據爲簡單起見。
- 1. 應該在沒有Backbone Collection的情況下使用Marionette CollectionView?
- 2. 在沒有ListIterator的情況下顯示LinkedList中的所有元素
- 3. 如何在沒有優化的情況下使用gcc與gcc?
- 4. 優勢的ArrayList
- 5. Javascript原型 - 在這種情況下有什麼優勢?
- 6. 在沒有明確複製的情況下使用Einsum
- 7. 在沒有明確命名列的情況下使用RETURNING
- 8. 在沒有明確使用KRL的情況下舉辦活動
- 9. 在沒有對應值的情況下在printf()中使用格式說明符
- 10. 在沒有使用ItemTempalte的情況下使用RadToolTip和RadComboBox
- 11. 在沒有GPS/Mapkit的情況下顯示兩個位置之間的方向
- 12. 默認情況下無協議網址比https更有優勢?
- 13. 應該在沒有磁盤容器的情況下使用Berkeley DB XML?
- 14. 在沒有MVC應用程序的情況下使用模型
- 15. Boost庫使用情況和優勢比其他庫
- 16. 我應該在什麼情況下使用模塊和課程
- 17. 我應該在哪種情況下使用MySQL和SSL協議?
- 18. Detailtext沒有顯示的情況下?
- 19. 如果通過ArrayList和LinkedList實現,以下代碼的運行情況如何?
- 20. 如何在沒有集合的情況下洗牌ArrayList
- 21. 在沒有用jQuery替換$的情況下使用jquery和Magento?
- 22. 優化iOS應用某些情況下
- 23. 在沒有路由器組件的情況下使用反應
- 24. 變量之間沒有設置的情況下?
- 25. 在沒有ODM的情況下使用MongoDB和PHP
- 26. 在沒有Visual Studio的情況下使用MFC和ATL庫
- 27. 可以在沒有where()的情況下使用Doctrine QueryBuilder和Where()?
- 28. 如何在沒有npm和Node.js的情況下使用AngularJS 2?
- 29. 如何在沒有插件的情況下使用fancybox和wordpress?
- 30. 在沒有npm的情況下使用socket.io和express模塊
這是一個非常有趣的觀點 –