相同點:
1、ArrayList和Vector都是繼承了相同的父類和實現了相同的接口
2、底層都是數組實現的
3、初始默認長度都為10。
不同點:
1、同步性:
Vector中的public方法多數添加了synchronized關鍵字,以確保方法同步,也即是Vector線程安全,ArrayList線程不安全。
2、擴容不同
內部屬性不同,這可能是導致擴容方式不同的原因所在。
ArrayList有兩個屬性,存儲數據的數組elementData,和存儲記錄數目的size。
Vector有三個屬性,存儲數據的數組elementData,存儲記錄數目的elementCount,還有擴展數組大小的擴展因子capacityIncrement。
ArrayList的擴展方法
1
2
3
4
5
6
7
8
9
10
11
12
|
//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); } |
可以看出,在滿足擴容條件時,擴展后數組大小為原數組長度的1.5倍與傳遞參數中較大者
Vector的擴展方法
1
2
3
4
5
6
7
8
9
10
11
12
|
//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); } |
可以看出,當擴容因子大于0時,新數組長度為原數組長度+擴容因子,否則子新數組長度為原數組長度的2倍。 將上面生成的新數組長度與傳遞的參數長度作比較,較大者為最終的新長度。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!