相同點(diǎn):
1、ArrayList和Vector都是繼承了相同的父類和實(shí)現(xiàn)了相同的接口
2、底層都是數(shù)組實(shí)現(xiàn)的
3判导、初始默認(rèn)長度都為10。
不同點(diǎn):
1沛硅、同步性:
Vector中的public方法多數(shù)添加了synchronized關(guān)鍵字骡楼,以確保方法同步,也即是Vector線程安全稽鞭,ArrayList線程不安全鸟整。
2、擴(kuò)容不同
內(nèi)部屬性不同朦蕴,這可能是導(dǎo)致擴(kuò)容方式不同的原因所在篮条。
ArrayList有兩個屬性,存儲數(shù)據(jù)的數(shù)組elementData吩抓,和存儲記錄數(shù)目的size涉茧。
Vector有三個屬性,存儲數(shù)據(jù)的數(shù)組elementData疹娶,存儲記錄數(shù)目的elementCount伴栓,還有擴(kuò)展數(shù)組大小的擴(kuò)展因子capacityIncrement。
ArrayList的擴(kuò)展方法
//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);
}
可以看出雨饺,在滿足擴(kuò)容條件時钳垮,擴(kuò)展后數(shù)組大小為原數(shù)組長度的1.5倍與傳遞參數(shù)中較大者
Vector的擴(kuò)展方法
//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)擴(kuò)容因子大于0時额港,新數(shù)組長度為原數(shù)組長度+擴(kuò)容因子饺窿,否則子新數(shù)組長度為原數(shù)組長度的2倍。 將上面生成的新數(shù)組長度與傳遞的參數(shù)長度作比較移斩,較大者為最終的新長度肚医。
微信公眾號:志哥 (ID: zhige-me)
期待與你相遇,一同成長前行向瓷!