相同點:
1、ArrayList和Vector都是繼承了相同的父類和實現(xiàn)了相同的接口
2、底層都是數(shù)組實現(xiàn)的
3、初始默認長度都為10。
不同點:
1、同步性:
Vector中的public方法多數(shù)添加了synchronized關(guān)鍵字,以確保方法同步,也即是Vector線程安全,ArrayList線程不安全。
2、擴容不同
內(nèi)部屬性不同,這可能是導(dǎo)致擴容方式不同的原因所在。
ArrayList有兩個屬性,存儲數(shù)據(jù)的數(shù)組elementData,和存儲記錄數(shù)目的size。
Vector有三個屬性,存儲數(shù)據(jù)的數(shù)組elementData,存儲記錄數(shù)目的elementCount,還有擴展數(shù)組大小的擴展因子capacityIncrement。
ArrayList的擴展方法
//jdk1.8.0_91
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
可以看出,在滿足擴容條件時,擴展后數(shù)組大小為原數(shù)組長度的1.5倍與傳遞參數(shù)中較大者
Vector的擴展方法
//jdk1.8.0_91
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);
}
可以看出,當(dāng)擴容因子大于0時,新數(shù)組長度為原數(shù)組長度+擴容因子,否則子新數(shù)組長度為原數(shù)組長度的2倍。 將上面生成的新數(shù)組長度與傳遞的參數(shù)長度作比較,較大者為最終的新長度。
微信公眾號:志哥 (ID: zhige-me)
期待與你相遇,一同成長前行!