天天看點

java ArrayList源碼分析(轉載)

1.ArrayList是一個相對來說比較簡單的資料結構,最重要的一點就是它的自動擴容,可以認為就是我們常說的“動态數組”。

  來看一段簡單的代碼:

在執行這四條語句時,是這麼變化的:

java ArrayList源碼分析(轉載)

其中,<code>add</code>操作可以了解為直接将數組的内容置位,<code>remove</code>操作可以了解為删除index為0的節點,并将後面元素移到0處。

當我們在ArrayList中增加元素的時候,會使用<code>add</code>函數。他會将元素放到末尾。具體實作如下:

我們可以看到他的實作其實最核心的内容就是<code>ensureCapacityInternal</code>。這個函數其實就是自動擴容機制的核心。我們依次來看一下他的具體實作

也就是說,當增加資料的時候,如果ArrayList的大小已經不滿足需求時,那麼就将數組變為原長度的1.5倍,之後的操作就是把老的數組拷到新的數組裡面。例如,預設的數組大小是10,也就是說當我們<code>add</code>10個元素之後,再進行一次add時,就會發生自動擴容,數組長度由10變為了15具體情況如下所示:

java ArrayList源碼分析(轉載)

Array的put和get函數就比較簡單了,先做index檢查,然後執行指派或通路操作:

注釋很清楚:

Removes the element at the specified position in this list. Shifts any subsequent elements to the left (subtracts one from their indices).