Java Collections Framework之ArrayList源碼分析
該類是JDK1.2中添加的類,可用于替代Vector(1.1中包含的類庫) 其內部持有的也是一個數組。Hierarchy的結構如下:
該類并非線程安全的,主要含有兩個字段:
elementData:內部持有的數組
size:ArrayList的長度
構造函數如下:
利用該參數初始化該數組。
將數組的大小設置為10,為該數組分配內存空間。
根據Collection c初始化該ArrayList,底層使用的是System.arrayCopy方法
向該List的尾部添加元素:
首先會調用ensureCapacity(size + 1)方法,檢查該List持有的數組是否已到達峰值,如果到了則擴充此數組
由代碼可知,每次擴充為原來的一點五倍,可知該操作當容量變大的時候會嚴重造成內存空間的浪費。
addAll(int index, Collection
c):
在index位置處依次添加c中的元素,同時將該index處的元素依次右移。
addAll(Collection
c):
從該List的尾部依次添加c中含有的元素
clear():
清空該List,內部持有的數組的長度并不發生變化。
indexOf(Object o):
返回某元素在該List中的索引。
indexOf(Object o):
從該List尾部查找第一次出現該o時的索引。
contains(Object o):
查找該List是否包含o
fastRemove(int index):
刪除該索引處的元素,并且使該索引后面的元素依次左移。
get(int index):
獲取索引index處的元素。
isEmpty():
判斷該List是否為空
remove(int index):
刪除index處的元素,同時右邊的元素左移。
remove(Object o):
先查找,再刪除。設計到數組元素的左移。
set(int index, E element):
于位置index處設置為element
size():
返回該集合的長度
toArray():
將該集合轉化為Object數組。
toArray(T[] a):
將該集合轉化為特定的數組。
trimToSize():
將該數組中空的占位符剔除,以便GC回收。
總結:
該類和Vector的機構幾乎完全相同,該集合非線程安全。