Java集合---Vector(4)
阿新 • • 發佈:2018-12-04
用途與特點
可用於在需要儲存有序的,可動態擴充執行緒安全的集合。整理邏輯演算法上基本與ArrayList相同,但在操做資料的方法上都使用了synchronized關鍵字,在多 執行緒呼叫時,會將並行請求,變為序列請求,因為使用了synchronized方法,所以他的效能方面比ArrayList要差。建議在非執行緒下使用ArrayList。
實現演算法
底層實現方式其實就是Object[]陣列實現,根據封裝會儲存實際儲存大小elementCount物件,與存放資料的elementData。演算法基本與ArrayList相同。
預設初始陣列長度是10,最大集合長度是Integer.MAX_VALUE大概21億多
新增
刪除
在刪除資料時只會對陣列進行移到操作,並不會修改調整陣列的長度,所以對於記憶體方面如建立一個長度是100的資料集合,刪除了90個數據,集合陣列長度也不會縮小。
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已滿時進行擴容
擴充的新陣列長度是: 原陣列長度 + (原陣列長度 / 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版本原始碼解讀