Java集合之ArrayList原始碼分析
概述
ArrayList可以理解為動態陣列, 根據MSDN的說法, 就是Array的複雜版本. 與陣列相比, 它的容量能動態增長. ArrayList是List介面的可變陣列的實現. 實現了所有可選列表操作, 允許包括null在內的所有元素.
陣列的特點, 查詢快增刪慢.
每個ArrayList例項都有一個容量, 該容量是指向用來儲存列表元素的陣列大小. 隨著向ArrayList中不斷新增元素, 其容量也自動增長, 自動增長會帶來資料向新陣列的重新拷貝, 因此, 如果可預知資料量的多少, 可在構造ArrayList時指定其容量. 在新增大量元素前, 應用程式也可以使用 ensureCapacity 方法來增加ArrayList例項的容量, 可以減少遞增式再分配的數量.
注意: ArrayList不是執行緒安全的.
ArrayList原理
ArrayList實現了List介面、底層使用陣列儲存所有元素, 其操作基本上是對陣列的操作.
ArrayList繼承了AbstractList, 實現了List. 它是一個數組, 提供了相關的新增、刪除、修改、遍歷等.
ArrayList實現了RandmoAccess介面, 即提供了隨機訪問功能. RandmoAccess是java中用來被List實現的, 為List提供快速訪問功能的. 在ArrayList中, 可以通過元素的序號快速獲取元素物件, 這就是快速隨機訪問.
ArrayList實現了Cloneable介面, 即覆蓋了函式clone(), 能被克隆.
ArrayList實現java.io.Serizlizable介面, 這意味著ArrayList支援序列化, 能通過序列化去傳輸.
1.ArrayLIst底層用陣列實現
其他欄位:
2.建構函式
3.儲存
ArrayList提供了多種新增元素的方法.
(1)add(E e)方法, 將指定元素新增到列表的尾部. 當容量不足時, 呼叫 grow 增長容量.
可以看到, 方法核心內容就是 ensureCapacityInternal 方法. 用於調整陣列容量, 這個函式就是 自動擴容機制的核心. 其實現如下:
也就是說, 當增加資料時, 若ArrayList大小不夠了, 那麼將陣列擴容為原來的1.5倍.
(2)add(int, E)在指定位置插入元素
(3)set(int, E)將指定位置的元素替換, 返回舊的元素的值
(4)addAll(Collection)將指定Collection中的元素新增到末尾
(5)addAll(int, Collection)將指定Collection中的元素新增到指定位置
方法基本都大同小異, 重要的就是為陣列擴容
4.讀取
讀取的方法就比較簡單了, ArrayList 能夠支援隨機訪問的原因也是很顯然的, 因為它內部的資料結構是陣列, 而陣列本身就是支援隨機訪問
5.刪除
(1)remove(int)刪除指定下標的元素並返回
(2)remove(Object)刪除指定的元素, 返回是否成功(布林值)
刪除陣列中的元素, 會將元素後面的所有元素向左移動一個位置.
6.調整陣列容量
ensureCapacity 方法用於調整陣列的容量
可以關注一下鄙人的公眾號, 謝謝各位了!