1. 程式人生 > >Java集合之ArrayList原始碼分析

Java集合之ArrayList原始碼分析

概述

ArrayList可以理解為動態陣列, 根據MSDN的說法, 就是Array的複雜版本. 與陣列相比, 它的容量能動態增長. ArrayList是List介面的可變陣列的實現. 實現了所有可選列表操作, 允許包括null在內的所有元素.

陣列的特點, 查詢快增刪慢.

每個ArrayList例項都有一個容量, 該容量是指向用來儲存列表元素的陣列大小. 隨著向ArrayList中不斷新增元素, 其容量也自動增長, 自動增長會帶來資料向新陣列的重新拷貝, 因此, 如果可預知資料量的多少, 可在構造ArrayList時指定其容量. 在新增大量元素前, 應用程式也可以使用 ensureCapacity 方法來增加ArrayList例項的容量, 可以減少遞增式再分配的數量.

注意: ArrayList不是執行緒安全的.

ArrayList原理

ArrayList實現了List介面、底層使用陣列儲存所有元素, 其操作基本上是對陣列的操作.

Java集合之ArrayList

 

ArrayList繼承了AbstractList, 實現了List. 它是一個數組, 提供了相關的新增、刪除、修改、遍歷等.

ArrayList實現了RandmoAccess介面, 即提供了隨機訪問功能. RandmoAccess是java中用來被List實現的, 為List提供快速訪問功能的. 在ArrayList中, 可以通過元素的序號快速獲取元素物件, 這就是快速隨機訪問.

ArrayList實現了Cloneable介面, 即覆蓋了函式clone(), 能被克隆.

ArrayList實現java.io.Serizlizable介面, 這意味著ArrayList支援序列化, 能通過序列化去傳輸.

1.ArrayLIst底層用陣列實現

Java集合之ArrayList

 

其他欄位:

Java集合之ArrayList

 

2.建構函式

Java集合之ArrayList

 

Java集合之ArrayList

 

Java集合之ArrayList

 

3.儲存

ArrayList提供了多種新增元素的方法.

(1)add(E e)方法, 將指定元素新增到列表的尾部. 當容量不足時, 呼叫 grow 增長容量.

Java集合之ArrayList

 

可以看到, 方法核心內容就是 ensureCapacityInternal 方法. 用於調整陣列容量, 這個函式就是 自動擴容機制的核心. 其實現如下:

Java集合之ArrayList

 

Java集合之ArrayList

 

也就是說, 當增加資料時, 若ArrayList大小不夠了, 那麼將陣列擴容為原來的1.5倍.

(2)add(int, E)在指定位置插入元素

Java集合之ArrayList

 

(3)set(int, E)將指定位置的元素替換, 返回舊的元素的值

Java集合之ArrayList

 

(4)addAll(Collection)將指定Collection中的元素新增到末尾

Java集合之ArrayList

 

(5)addAll(int, Collection)將指定Collection中的元素新增到指定位置

Java集合之ArrayList

 

方法基本都大同小異, 重要的就是為陣列擴容

4.讀取

讀取的方法就比較簡單了, ArrayList 能夠支援隨機訪問的原因也是很顯然的, 因為它內部的資料結構是陣列, 而陣列本身就是支援隨機訪問

Java集合之ArrayList

 

5.刪除

(1)remove(int)刪除指定下標的元素並返回

Java集合之ArrayList

 

(2)remove(Object)刪除指定的元素, 返回是否成功(布林值)

Java集合之ArrayList

 

Java集合之ArrayList

 

刪除陣列中的元素, 會將元素後面的所有元素向左移動一個位置.

6.調整陣列容量

ensureCapacity 方法用於調整陣列的容量

Java集合之ArrayList

 

 

可以關注一下鄙人的公眾號, 謝謝各位了!