LinkedeList和ArrayList都實現了List接口,但是它們的工作原理卻不一樣。它們之間最主要的區別在於ArrayList是可改變大小的數組,而LinkedList是雙向鏈接串列(doubly LinkedList)。ArrayList更受歡迎,很多場景下ArrayList比LinkedList更為適用。這篇文章中我們將會看看LinkedeList和ArrayList的不同,而且我們試圖來看看什么場景下更適宜使用LinkedList,而不用ArrayList。
LinkedList和ArrayList的區別
LinkedList和ArrayList的差別主要來自於Array和LinkedList數據結構的不同。如果你很熟悉Array和LinkedList,你很容易得出下面的結論:
1) 因為Array是基於索引(index)的數據結構,它使用索引在數組中搜索和讀取數據是很快的。Array獲取數據的時間復雜度是O(1),但是要刪除數據卻是開銷很大的,因為這需要重排數組中的所有數據。
2) 相對於ArrayList,LinkedList插入是更快的。因為LinkedList不像ArrayList一樣,不需要改變數組的大小,也不需要在數組裝滿的時候要將所有的數據重新裝入一個新的數組,這是ArrayList最壞的一種情況,時間復雜度是O(n),而LinkedList中插入或刪除的時間復雜度僅為O(1)。ArrayList在插入數據時還需要更新索引(除了插入數組的尾部)。
3) 類似於插入數據,刪除數據時,LinkedList也優於ArrayList。
4) LinkedList需要更多的內存,因為ArrayList的每個索引的位置是實際的數據,而LinkedList中的每個節點中存儲的是實際的數據和前后節點的位置。
什么場景下更適宜使用LinkedList,而不用ArrayList
我前面已經提到,很多場景下ArrayList更受歡迎,但是還有些情況下LinkedList更為合適。譬如:
1) 你的應用不會隨機訪問數據。因為如果你需要LinkedList中的第n個元素的時候,你需要從第一個元素順序數到第n個數據,然后讀取數據。
2) 你的應用更多的插入和刪除元素,更少的讀取數據。因為插入和刪除元素不涉及重排數據,所以它要比ArrayList要快。
以上就是關於ArrayList和LinkedList的差別。你需要一個不同步的基於索引的數據訪問時,請盡量使用ArrayList。ArrayList很快,也很容易使用。但是要記得要給定一個合適的初始大小,盡可能的減少更改數組的大小。