ArrayList和LinkedList底層原理的區別和使用場景

千古一辙發表於2024-03-14

(1)ArrayList底層是動態陣列,查詢快、增刪慢。儲存空間是連續的,可以根據定址方式直接找到對應的元素位置,所以查詢時間複雜度是o(1)。

  • 擴容:ArrayList支援動態擴容,在每次新增元素的時候會判斷容量是否溢位,如果溢位則會進行擴容操作。當size=elementData.length時,表示資料數量已經超過了陣列容量,需要擴容,擴容後的陣列長度為原來陣列長度的1.5倍。
  • 複製:當擴容操作結束後,如果新增的元素不在陣列尾部,則將索引後面的元素透過System.arraycopy往後移動一位。
  • 賦值:將值賦給陣列中對應的索引,並將size++。

  add()時間複雜度是o(1)或者o(n),remove()的時間複雜度是o(n),get()、set()的時間複雜度是o(1)。


(2)LinkedList底層是一個雙向連結串列,查詢慢、增刪快。儲存空間不連續,節點之間是透過指標進行關聯的,在查詢過程中需要不斷跳轉新的地址,沒有初始化大小,也沒有擴容機制,可以在連結串列首尾進行新增節點。

  add()、remove()的時間複雜度是o(1),get()、set()的時間複雜度是o(n)。

參考文獻:https://blog.csdn.net/xingyu19911016/article/details/125049128

相關文章