目錄
1.ArrayList數據結構
2.主要參數
3.核心構造方法
3.1初始容量(10)
4. add(E e)方法
5.add(int index, E element)方法
6擴容機制
6.1 Arrays.copyOf(T[] original, int newLength)
7. get(intindex)
9.總結
1.ArrayList數據結構
private transient Object[] elementData;
|
可以看出ArrayList的數據結構爲一個數組(查找速度快,使用索引的方式來快速定位對象的位置)
2.主要參數
private static final int DEFAULT_CAPACITY = 10;
private static final Object[] EMPTY_ELEMENTDATA = {};
private transient Object[] elementData;
private int size;
|
3.核心構造方法
public ArrayList() {
super();
this.elementData = EMPTY_ELEMENTDATA;
}
public ArrayList(int initialCapacity) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];
}
|
3.1初始容量(10)
可見初始化的時候可以指定ArrayList的容量,add方法會把容量最小設置爲10(也算默認容量了);
4. add(E e)方法
public boolean add(E e) {
ensureCapacityInternal(size + 1); // 設置初始容量大於等於10;
elementData[size++] = e; //添加元素在尾部
return true;
}
|
add(E e)方法直接將目標元素放置到數組末尾。
5.add(int index, E element)方法
public void add(int index, E element) {
rangeCheckForAdd(index); //索引大於數組長度拋異常IndexOutOfBoundsException
ensureCapacityInternal(size + 1); // 擴容
System.arraycopy(elementData, index, elementData, index + 1,
size - index);
elementData[index] = element; //可以插入索引和值
size++;
}
|
6擴容機制
由構造方法可知第一次創建數組的時候this.elementData = EMPTY_ELEMENTDATA;所以初始化容量最小爲10;
以後每次添加新元素都會檢查容量,容量不夠擴大當前容量的50%
private void ensureCapacityInternal(int minCapacity) {
if (elementData == EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity); }
|
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// overflow-conscious code
//當容量不足才擴容 if (minCapacity - elementData.length > 0)
grow(minCapacity); //核心擴容方法 }
|
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
//擴大原來容量的50% int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// 擴大原來數組的長度Arrays.copyOf()分析如下 elementData = Arrays.copyOf(elementData, newCapacity);
}
|
6.1 Arrays.copyOf(T[] original, int newLength)
public static void main(String[] args) {
Object [] a;
a = new Object[]{1, 2, 3, 4, 5};
a = Arrays.copyOf(a, a.length<<1);
for (int i = 0; i < a.length; i++)
System.out.print(a[i] + " ");
System.out.println();
}
|
輸出
可以看出來數組的長度擴大了一倍
7. get(intindex)
//通過索引查找速度快
public E get(int index) {
rangeCheck(index);
return elementData(index);
}
|
8. remove(Object o)方法
//需要遍歷比較慢
public boolean remove(Object o) {
Iterator<E> it = iterator();
if (o==null) {
while (it.hasNext()) {
if (it.next()==null) {
it.remove();
return true;
}
}
} else {
while (it.hasNext()) {
if (o.equals(it.next())) {
it.remove();
return true;
}
}
}
return false;
}
|
9.總結
1.ArrayList的數據結構是數組,所以具有數組的特性,根據索引查詢速度快,添加元素直接添加在尾部也快,按照索引插入用的是System.arraycopy()方法,刪除需要循環遍歷比較慢。
2. ArrayList的數組初始長度爲10,每次擴容擴大50%,擴大數組的方式用的是 Arrays.copyOf()方法
elementData = Arrays.copyOf(elementData, newCapacity);