總結: ArrayList與Vector集合的底層都是通過Object[] elementData數組存放對象的 ArrayList使用無參構造器時,初始容量為0,當存放一個對象後,容量擴容為10,此後按1.5*當前容量進行擴容 ArrayList使用帶參構造器時,初始容量為設定值,當存放對象個數達 ...
目錄
總結:
- ArrayList與Vector集合的底層都是通過Object[] elementData數組存放對象的
- ArrayList使用無參構造器時,初始容量為0,當存放一個對象後,容量擴容為10,此後按1.5*當前容量進行擴容
- ArrayList使用帶參構造器時,初始容量為設定值,當存放對象個數達到集合容量上限後,此後按1.5*當前容量進行擴容
- Vector使用無參構造器時,初始容量為10,當存放對象個數達到集合容量上限後,此後按2*當前容量進行擴容
- Vector使用帶參構造器時,初始容量為設定值,當存放對象個數達到集合容量上限後,此後按2*當前容量進行擴容
- Vector集合支持多線程,ArrayList集合不支持多線程,ArrayList比Vector效率高
一、使用預設無參構造器創建Vector集合
1.測試代碼
public class Vector01 {
public static void main(String[] args) {
Vector vector = new Vector(); //跳轉至第1步
for (int i = 0; i < 50; i++) {
vector.add(i);
}
}
}
2.底層代碼
第1步
public Vector() {
this(10); //表示使用本類中重載的帶1個int類型參數的構造器(需要放在構造器首行),跳轉至第2步
}
第2步
public Vector(int initialCapacity) {
this(initialCapacity, 0); //表示使用本類中重載的帶2個參數(int,int)的構造器,跳轉至第3步
}
第3步
public Vector(int initialCapacity, int capacityIncrement) {
super(); //顯示調用父類的無參構造器(需要放在構造器首行),跳轉至第4步
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity);
this.elementData = new Object[initialCapacity];
this.capacityIncrement = capacityIncrement;
}
第4步
進入Vector類的父類AbstractList類中,調用父類無參構造器
protected AbstractList() {
//super(); 隱式的調用父類的無參構造器
}
...
protected transient int modCount = 0; //從第5步執行之後跳轉至此,然後跳轉至第3步
第5步
繼續進入AbstractList類的父類AbstractCollection類中,調用父類無參構造器,AbstractCollection的直接父類為Object
protected AbstractCollection() {
}
第6步
此時Vector集合創建完成,vector = {null, null, null, null, null, null, null, null, null, null}
第7步
執行for迴圈語句,當i = 0時,執行vector.add(i)
public synchronized boolean add(E e) {
modCount++;
ensureCapacityHelper(elementCount + 1); //跳轉至第8步
elementData[elementCount++] = e;
return true;
}
第8步
private void ensureCapacityHelper(int minCapacity) {
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
第9步
由於初始容量為10,可以存放10個對象,當達到容量上限後,需要進行擴容處理
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
capacityIncrement : oldCapacity);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
第10步
經過擴容後,新的Vector集合的容量=原容量*2
二、使用帶參構造器創建Vector集合
1.測試代碼
public class Vector01 {
public static void main(String[] args) {
Vector vector = new Vector(5); //跳轉至第1步
for (int i = 0; i < 50; i++) {
vector.add(i);
}
}
}
2.底層代碼
第1步
public Vector(int initialCapacity) {
this(initialCapacity, 0);
}
此後的執行方式與使用無參構造器時的方式完全相同。