1. 程式人生 > 其它 >淺析ArrayList的擴容機制 移除機制

淺析ArrayList的擴容機制 移除機制

擴容機制

ArrayList的底層是陣列,因此ArrayList的擴容機制就是依靠Arrays.copyOf()實現的 但是在具體的判斷上要說明一下:
當ArrayList創建出來時,如果給了初始容量,那麼就會有一個初始容量

如果沒有設定 那麼初始容量就預設為10
容量設定發生在第一次新增資料前 接著就是根據程式碼不斷向其中新增資料
當第10次新增資料時,整個ArrayList就被填滿了
此時如果繼續新增 那麼在第11次新增資料前,系統就會自動對ArrayList進行擴容:

從程式碼可以看出新的容量是原有容量的1.5倍 因為 變數>>1 代表著資料除以2

在上次擴容後,新容量為15,那麼在第16次新增資料時 底層又會在原15的容量上擴容1.5倍 然後向下取整
以後的趨勢是越擴容越大(底數越來越大 擴容1.5倍不變)

移除機制

為什麼java的hashmap不支援動態縮小容量? - 知乎 (zhihu.com)
ArrayList的移除機制和陣列相同,也是將被刪除資料的後置位資料往前移,依次覆蓋前一個數據
不同的是ArrayList在刪除資料後,容量不會改變
也就是說如果ArrayList此時容量為15,那麼即便我刪除到只剩下一個數據,容量也不會修改回10

Java在大部分情況下都是用空間換時間的,縮容這種不符合Java的哲學

由於ArrayList的刪除機制與陣列一樣,所以如果ArrayList裡有1000個數據,我要移除第10個數據,那麼後面990個數據也得動
因此ArrayList移除資料的效率很低