底層是基於數組實現的。java
這裏須要說明一下,由於 ArrayList 元素增刪涉及增刪元素位置以後的元素移動,極大的影響了性能。
固然這裏提出兩個觀點:算法
- 第一種狀況:假如增刪元素在 ArrayList 的末尾,這種狀況下和 LinkedList 的性能優越就須要再次討論。
- 第二種狀況:假如增刪元素在 ArrayList 的中間,咱們要知道,LinkedList 的性能損耗只要體如今元素遍歷上,而 ArrayList 的性能損耗主要體如今複製移動元素上,因此這種狀況下二者的性能優越性還須要再次討論。
話題來到咱們討論的重點,ArrayList 的擴容機制:
前面咱們說道,ArrayList 的底層是數組,那麼數組的一個特性就是初始化必需要指定大小,那麼隨着元素的不斷增長,如何進行擴容就成爲了一個須要關注的問題。數組
咱們在進行添加 add() 操做以前,會首先判斷 size 的大小,判斷是否能執行add()操做而不報錯。數據結構
public boolean add(E e) { ensureCapacityInternal(size + 1); elementData[size++] = e; return true; }
先調用 ensureCapacityInternal 方法,傳入 size+1 進去,檢查是否須要擴充 elementData 數組的大小。post
若是肯定須要擴容的話,使用 grow() 方法,newCapacity = 擴充數組爲原來的1.5倍(不能自定義),若是還不夠,就使用它指定要擴充的大小minCapacity,而後判斷minCapacity是否大於MAX_ARRAY_SIZE(Integer.MAX_VALUE - 8) ,若是大於,就取Integer.MAX_VALUE性能
在 ArrayList 成功擴充以後,最後一步要進行的是元素的複製,咱們這裏調用的是 ArrayList 下的 arraycopy() 方法。code
部份內容參考自:
1.《數據結構與算法分析:java語言描述》
2.https://juejin.im/post/5d42ab...ci