ArrayList和LinkedList有什麼區別(看完必懂)

ArrayList和LinkedList都實現了List接口,他們有以下的不同點:
ArrayList是基於索引的數據接口,它的底層是數組。它可以以O(1)時間複雜度對元素進行隨機訪問。與此對應,LinkedList是以元素列表的形式存儲它的數據,每一個元素都和它的前一個和後一個元素鏈接在一起,在這種情況下,查找某個元素的時間複雜度是O(n)。
相對於ArrayList,LinkedList的插入,添加,刪除操作速度更快,因爲當元素被添加到集合任意位置的時候,不需要像數組那樣重新計算大小或者是更新索引。
LinkedList比ArrayList更佔內存,因爲LinkedList爲每一個節點存儲了兩個引用,一個指向前一個元素,一個指向下一個元素。
也可以參考ArrayList vs. 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 實例存儲了兩個值: Node<E> first 和 Node<E> last 分別表示鏈表的其實節點和尾節點,每個 Node 實例存儲了三個值: E item,Node next,Node pre) 。

什麼場景下更適宜使用 LinkedList,而不用ArrayList

1) 你的應用不會隨機訪問數據 。因爲如果你需要LinkedList中的第n個元素的時候,你需要從第一個元素順序數到第n個數據,然後讀取數據。

2) 你的應用更多的插入和刪除元素,更少的讀取數據 。因爲插入和刪除元素不涉及重排數據,所以它要比ArrayList要快。

換句話說,ArrayList的實現用的是數組,LinkedList是基於鏈表,ArrayList適合查找,LinkedList適合增刪

 

以上就是關於 ArrayList和LinkedList的差別。你需要一個不同步的基於索引的數據訪問時,請儘量使用ArrayList。ArrayList很快,也很容易使用。但是要記得要給定一個合適的初始大小,儘可能的減少更改數組的大小。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章