其餘更多java基礎文章:
java基礎學習(目錄)java
雖然,Vector和Stack在咱們的編程中,使用的比較少,至少我使用的比較少,通常狀況下,我都是傾向於使用List來存儲一些同類型的元素。
Vector的內部實現和ArrayList的內部實現基本一致,內部都是藉助於數組來實現的,主要區別是方法加了synchronized
關鍵字,實現了線程安全。
Stack是繼承自Vector來實現的,並且Stack只是在Vector的基礎上提供了幾個方法罷了,就不展開講解了。編程
public class Vector<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
複製代碼
Vector繼承了AbstractList抽象類並實現了List、RandomAccess、Cloneable、Serializable接口,和ArrayList同樣。數組
protected Object[] elementData;
protected int elementCount;
protected int capacityIncrement;
複製代碼
public synchronized boolean add(E e) {
modCount++;
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = e;
return true;
}
//在指定位置添加元素
public void add(int index, E element) {
insertElementAt(element, index);
}
public synchronized void insertElementAt(E obj, int index) {
modCount++;
//有效性檢查
if (index > elementCount) {
throw new ArrayIndexOutOfBoundsException(index
+ " > " + elementCount);
}
//檢查是否須要擴容,若須要,則進行擴容
ensureCapacityHelper(elementCount + 1);
//拷貝
System.arraycopy(elementData, index, elementData, index + 1, elementCount - index);
elementData[index] = obj;
elementCount++;
}
private void ensureCapacityHelper(int minCapacity) {
// overflow-conscious code
//當數組已滿,則調用grow函數來對數組進行擴容
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
//擴容的大小由capacityIncrement決定,若是capacityIncrement<=0,則擴容到目前數組的兩倍
int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
capacityIncrement : oldCapacity);
//檢查是否newCapacity溢出了
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
//進行元素的拷貝
elementData = Arrays.copyOf(elementData, newCapacity);
}
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}
複製代碼
基本沒什麼難度,增長了synchronized
關鍵字,實現了線程安全,其餘跟ArrayList的基本同樣。能夠參考java基礎:ArrayList — 源碼分析。
惟一有點不一樣的是,Vector的擴容默認是擴容爲2倍,若capacityIncrement不爲0,則擴容capacityIncrement的值。ArrayList則是擴容爲1.5倍。安全