用途與特色
可用於在須要存儲有序的,可動態擴充線程安全的集合。整理邏輯算法上基本與ArrayList相同,但在操作數據的方法上都使用了synchronized關鍵字,在多 線程調用時,會將並行請求,變爲串行請求,由於使用了synchronized方法,因此他的性能方面比ArrayList要差。建議在非線程下使用ArrayList。算法
實現算法數組
底層實現方式其實就是Object[]數組實現,根據封裝會存儲實際存儲大小elementCount對象,與存放數據的elementData。算法基本與ArrayList相同。安全
默認初始數組長度是10,最大集合長度是Integer.MAX_VALUE大概21億多併發
添加性能
刪除線程
在刪除數據時只會對數組進行移到操做,並不會修改調整數組的長度,因此對於內存方面如建立一個長度是100的數據集合,刪除了90個數據,集合數組長度也不會縮小。code
public synchronized E remove(int index) { modCount++; if (index >= elementCount) throw new ArrayIndexOutOfBoundsException(index); E oldValue = elementData(index); int numMoved = elementCount - index - 1; if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--elementCount] = null; // Let gc do its work return oldValue; }
擴容機制對象
擴容時機:是在加入數據時,elementData已滿時進行擴容blog
擴充的新數組長度是: 原數組長度 + (原數組長度 / 2)內存
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); }
是否線程安全,爲何?
線程安全,在源碼中對數據操做使用synchronized方法,保證了併發鎖。
根據jdk1.8版本源碼解讀