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