【java集合源碼剖析】Vector源碼剖析轉載請注明出處:http://blog.csdn.net/ns_code/article/details/35793865
Vector簡介 Vector也是基于數組實現的,是一個動態數組,其容量能自動增長。
Vector是JDK1.0引入了,它的很多實現方法都加入了同步語句,因此是線程安全的(其實也只是相對安全,有些時候還是要加入同步語句來保證線程的安全),可以用于多線程環境。
Vector沒有絲線Serializable接口,因此它不支持序列化,實現了Cloneable接口,能被克隆,實現了Randomaccess接口,支持快速隨機訪問。
Vector源碼剖析 Vector的源碼如下(加入了比較詳細的注釋):
[java] view plaincopy- packagejava.util;
- publicclassVector<E>
- extendsAbstractList<E>
- implementsList<E>,RandomAccess,Cloneable,java.io.Serializable
- {
- //保存Vector中數據的數組
- PRotectedObject[]elementData;
- //實際數據的數量
- protectedintelementCount;
- //容量增長系數
- protectedintcapacityIncrement;
- //Vector的序列版本號
- privatestaticfinallongserialVersionUID=-2767605614048989439L;
- //Vector構造函數。默認容量是10。
- publicVector(){
- this(10);
- }
- //指定Vector容量大小的構造函數
- publicVector(intinitialCapacity){
- this(initialCapacity,0);
- }
- //指定Vector"容量大小"和"增長系數"的構造函數
- publicVector(intinitialCapacity,intcapacityIncrement){
- super();
- if(initialCapacity<0)
- thrownewIllegalArgumentException("IllegalCapacity:"+
- initialCapacity);
- //新建一個數組,數組容量是initialCapacity
- this.elementData=newObject[initialCapacity];
- //設置容量增長系數
- this.capacityIncrement=capacityIncrement;
- }
- //指定集合的Vector構造函數。
- publicVector(Collection<?extendsE>c){
- //獲取“集合(c)”的數組,并將其賦值給elementData
- elementData=c.toArray();
- //設置數組長度
- elementCount=elementData.length;
- //c.toArraymight(incorrectly)notreturnObject[](see6260652)
- if(elementData.getClass()!=Object[].class)
- elementData=Arrays.copyOf(elementData,elementCount,Object[].class);
- }
- //將數組Vector的全部元素都拷貝到數組anArray中
- publicsynchronizedvoidcopyInto(Object[]anArray){
- System.arraycopy(elementData,0,anArray,0,elementCount);
- }
- //將當前容量值設為=實際元素個數
- publicsynchronizedvoidtrimToSize(){
- modCount++;
- intoldCapacity=elementData.length;
- if(elementCount<oldCapacity){
- elementData=Arrays.copyOf(elementData,elementCount);
- }
- }
- //確認“Vector容量”的幫助函數
- privatevoidensureCapacityHelper(intminCapacity){
- intoldCapacity=elementData.length;
- //當Vector的容量不足以容納當前的全部元素,增加容量大小。
- //若容量增量系數>0(即capacityIncrement>0),則將容量增大當capacityIncrement
- //否則,將容量增大一倍。
- if(minCapacity>oldCapacity){
- Object[]oldData=elementData;
- intnewCapacity=(capacityIncrement>0)?
- (oldCapacity+capacityIncrement):(oldCapacity*2);
- if(newCapacity<minCapacity){
- newCapacity=minCapacity;
- }
- elementData=Arrays.copyOf(elementData,newCapacity);
- }
- }
- //確定Vector的容量。
- publicsynchronizedvoidensureCapacity(intminCapacity){
- //將Vector的改變統計數+1
- modCount++;
- ensureCapacityHelper(minCapacity);
- }
- //設置容量值為newSize
- publicsynchronizedvoidsetSize(intnewSize){
- modCount++;
- if(newSize>elementCount){
- //若"newSize大于Vector容量",則調整Vector的大小。
- ensureCapacityHelper(newSize);
- }else{
- //若"newSize小于/等于Vector容量",則將newSize位置開始的元素都設置為null
- for(inti=newSize;i<elementCount;i++){
- elementData[i]=null;
- }
- }
- elementCount=newSize;
- }
- //返回“Vector的總的容量”
- publicsynchronizedintcapacity(){
- returnelementData.length;
- }
- //返回“Vector的實際大小”,即Vector中元素個數
- publicsynchronizedintsize(){
- returnelementCount;
- }
- //判斷Vector是否為空
- publicsynchronizedbooleanisEmpty(){
- returnelementCount==0;
- }
- //返回“Vector中全部元素對應的Enumeration”
- publicEnumeration<E>elements(){
- //通過匿名類實現Enumeration
- returnnewEnumeration<E>(){
- intcount=0;
- //是否存在下一個元素
- publicbooleanhasMoreElements(){
- returncount<elementCount;
- }
- //獲取下一個元素
- publicEnextElement(){
- synchronized(Vector.this){
- if(count<elementCount){
- return(E)elementData[count++];
- }
- }
- thrownewNoSuchElementException("VectorEnumeration");
- }
- };
- }
- //返回Vector中是否包含對象(o)
- publicbooleancontains(Objecto){
- returnindexOf(o,0)>=0;
- }
- //從index位置開始向后查找元素(o)。
- //若找到,則返回元素的索引值;否則,返回-1
- publicsynchronizedintindexOf(Objecto,intindex){
- if(o==null){
- //若查找元素為null,則正向找出null元素,并返回它對應的序號
- for(inti=index;i<elementCount;i++)
- if(elementData[i]==null)
- returni;
- }else{
- //若查找元素不為null,則正向找出該元素,并返回它對應的序號
- for(inti=index;i<elementCount;i++)
- if(o.equals(elementData[i]))
- returni;
- }
- return-1;
- }
- //查找并返回元素(o)在Vector中的索引值
- publicintindexOf(Objecto){
- returnindexOf(o,0);
- }
- //從后向前查找元素(o)。并返回元素的索引
- publicsynchronizedintlastIndexOf(Objecto){
- returnlastIndexOf(o,elementCount-1);
- }
- //從后向前查找元素(o)。開始位置是從前向后的第index個數;
- //若找到,則返回元素的“索引值”;否則,返回-1。
- publicsynchronizedintlastIndexOf(Objecto,intindex){
- if(index>=elementCount)
- thrownewIndexOutOfBoundsException(index+">="+elementCount);
- if(o==null){
- //若查找元素為null,則反向找出null元素,并返回它對應的序號
- for(inti=index;i>=0;i--)
- if(elementData[i]==null)
- returni;
- }else{
- //若查找元素不為null,則反向找出該元素,并返回它對應的序號
- for(inti=index;i>=0;i--)
- if(o.equals(elementData[i]))
- returni;
- }
- return-1;
- }
- //返回Vector中index位置的元素。
- //若index月結,則拋出異常
- publicsynchronizedEelementAt(intindex){
- if(index>=elementCount){
- thrownewArrayIndexOutOfBoundsException(index+">="+elementCount);
- }
- return(E)elementData[index];
- }
- //獲取Vector中的第一個元素。
- //若失敗,則拋出異常!
- publicsynchronizedEfirstElement(){
- if(elementCount==0){
- thrownewNoSuchElementException();
- }
- return(E)elementData[0];
- }
- //獲取Vector中的最后一個元素。
- //若失敗,則拋出異常!
- publicsynchronizedElastElement(){
- if(elementCount==0){
- thrownewNoSuchElementException();
- }
- return(E)elementData[elementCount-1];
- }
- //設置index位置的元素值為obj
- publicsynchronizedvoidsetElementAt(Eobj,intindex){
- if(index>=elementCount){
- thrownewArrayIndexOutOfBoundsException(index+">="+
- elementCount);
- }
- elementData[index]=obj;
- }
- //刪除index位置的元素
- publicsynchronizedvoidremoveElementAt(intindex){
- modCount++;
- if(index>=elementCount){
- thrownewArrayIndexOutOfBoundsException(index+">="+
- elementCount);
- }elseif(index<0){
- thrownewArrayIndexOutOfBoundsException(index);
- }
- intj=elementCount-index-1;
- if(j>0){
- System.arraycopy(elementData,index+1,elementData,index,j);
- }
- elementCount--;
- elementData[elementCount]=null;/*toletgcdoitswork*/
- }
- //在index位置處插入元素(obj)
- publicsynchronizedvoidinsertElementAt(Eobj,intindex){
- modCount++;
- if(index>elementCount){
- thrownewArrayIndexOutOfBoundsException(index
- +">"+elementCount);
- }
- ensureCapacityHelper(elementCount+1);
- System.arraycopy(elementData,index,elementData,index+1,elementCount-index);
- elementData[index]=obj;
- elementCount++;
- }
- //將“元素obj”添加到Vector末尾
- publicsynchronizedvoidaddElement(Eobj){
- modCount++;
- ensureCapacityHelper(elementCount+1);
- elementData[elementCount++]=obj;
- }
- //在Vector中查找并刪除元素obj。
- //成功的話,返回true;否則,返回false。
- publicsynchronizedbooleanremoveElement(Objectobj){
- modCount++;
- inti=indexOf(obj);
- if(i>=0){
- removeElementAt(i);
- returntrue;
- }
- returnfalse;
- }
- //刪除Vector中的全部元素
- publicsynchronizedvoidremoveAllElements(){
- modCount++;
- //將Vector中的全部元素設為null
- for(inti=0;i<elementCount;i++)
- elementData[i]=null;
- elementCount=0;
- }
- //克隆函數
- publicsynchronizedObjectclone(){
- try{
- Vector<E>v=(Vector<E>)super.clone();
- //將當前Vector的全部元素拷貝到v中
- v.elementData=Arrays.copyOf(elementData,elementCount);
- v.modCount=0;
- returnv;
- }catch(CloneNotSupportedExceptione){
- //thisshouldn'thappen,sinceweareCloneable
- thrownewInternalError();
- }
- }
- //返回Object數組
- publicsynchronizedObject[]toArray(){
- returnArrays.copyOf(elementData,elementCount);
- }
- //返回Vector的模板數組。所謂模板數組,即可以將T設為任意的數據類型
- publicsynchronized<T>T[]toArray(T[]a){
- //若數組a的大小<Vector的元素個數;
- //則新建一個T[]數組,數組大小是“Vector的元素個數”,并將“Vector”全部拷貝到新數組中
- if(a.length<elementCount)
- return(T[])Arrays.copyOf(elementData,elementCount,a.getClass());
- //若數組a的大小>=Vector的元素個數;
- //則將Vector的全部元素都拷貝到數組a中。
- System.arraycopy(elementData,0,a,0,elementCount);
- if(a.length>elementCount)
- a[elementCount]=null;
- returna;
- }
- //獲取index位置的元素
- publicsynchronizedEget(intindex){
- if(index>=elementCount)
- thrownewArrayIndexOutOfBoundsException(index);
- return(E)elementData[index];
- }
- //設置index位置的值為element。并返回index位置的原始值
- publicsynchronizedEset(intindex,Eelement){
- if(index>=elementCount)
- thrownewArrayIndexOutOfBoundsException(index);
- ObjectoldValue=elementData[index];
- elementData[index]=element;
- return(E)oldValue;
- }
- //將“元素e”添加到Vector最后。
- publicsynchronizedbooleanadd(Ee){
- modCount++;
- ensureCapacityHelper(elementCount+1);
- elementData[elementCount++]=e;
- returntrue;
- }
- //刪除Vector中的元素o
- publicbooleanremove(Objecto){
- returnremoveElement(o);
- }
- //在index位置添加元素element
- publicvoidadd(intindex,Eelement){
- insertElementAt(element,index);
- }
- //刪除index位置的元素,并返回index位置的原始值
- publicsynchronizedEremove(intindex){
- modCount++;
- if(index>=elementCount)
- thrownewArrayIndexOutOfBoundsException(index);
- ObjectoldValue=elementData[index];
- intnumMoved=elementCount-index-1;
- if(numMoved>0)
- System.arraycopy(elementData,index+1,elementData,index,
- numMoved);
- elementData[--elementCount]=null;//Letgcdoitswork
- return(E)oldValue;
- }
- //清空Vector
- publicvoidclear(){
- removeAllElements();
- }
- //返回Vector是否包含集合c
- publicsynchronizedbooleancontainsAll(Collection<?>c){
- returnsuper.containsAll(c);
- }
- //將集合c添加到Vector中
- publicsynchronizedbooleanaddAll(Collection<?extendsE>c){
- modCount++;
- Object[]a=c.toArray();
- intnumNew=a.length;
- ensureCapacityHelper(elementCount+numNew);
- //將集合c的全部元素拷貝到數組elementData中
- System.arraycopy(a,0,elementData,elementCount,numNew);
- elementCount+=numNew;
- returnnumNew!=0;
- }
- //刪除集合c的全部元素
- publicsynchronizedbooleanremoveAll(Collection<?>c){
- returnsuper.removeAll(c);
- }
- //刪除“非集合c中的元素”
- publicsynchronizedbooleanretainAll(Collection<?>c){
- returnsuper.retainAll(c);
- }
- //從index位置開始,將集合c添加到Vector中
- publicsynchronizedbooleanaddAll(intindex,Collection<?extendsE>c){
- modCount++;
- if(index<0||index>elementCount)
- thrownewArrayIndexOutOfBoundsException(index);
- Object[]a=c.toArray();
- intnumNew=a.length;
- ensureCapacityHelper(elementCount+numNew);
- intnumMoved=elementCount-index;
- if(numMoved>0)
- System.arraycopy(elementData,index,elementData,index+numNew,numMoved);
- System.arraycopy(a,0,elementData,index,numNew);
- elementCount+=numNew;
- returnnumNew!=0;
- }
- //返回兩個對象是否相等
- publicsynchronizedbooleanequals(Objecto){
- returnsuper.equals(o);
- }
- //計算哈希值
- publicsynchronizedinthashCode(){
- returnsuper.hashCode();
- }
- //調用父類的toString()
- publicsynchronizedStringtoString(){
- returnsuper.toString();
- }
- //獲取Vector中fromIndex(包括)到toIndex(不包括)的子集
- publicsynchronizedList<E>subList(intfromIndex,inttoIndex){
- returnCollections.synchronizedList(super.subList(fromIndex,toIndex),this);
- }
- //刪除Vector中fromIndex到toIndex的元素
- protectedsynchronizedvoidremoveRange(intfromIndex,inttoIndex){
- modCount++;
- intnumMoved=elementCount-toIndex;
- System.arraycopy(elementData,toIndex,elementData,fromIndex,
- numMoved);
- //Letgcdoitswork
- intnewElementCount=elementCount-(toIndex-fromIndex);
- while(elementCount!=newElementCount)
- elementData[--elementCount]=null;
- }
- //java.io.Serializable的寫入函數
- privatesynchronizedvoidwriteObject(java.io.ObjectOutputStreams)
- throwsjava.io.IOException{
- s.defaultWriteObject();
- }
- }
幾點總結 Vector的源碼實現總體與ArrayList類似,關于Vector的源碼,給出如下幾點總結:
1、Vector有四個不同的構造方法。無參構造方法的容量為默認值10,僅包含容量的構造方法則將容量增長量(從源碼中可以看出容量增長量的作用,第二點也會對容量增長量詳細說)明置為0。
2、注意擴充容量的方法ensureCapacityHelper。與 ArrayList相同,Vector在每次增加元素(可能是1個,也可能是一組)時,都要調用該方法來確保足夠的容量。當容量不足以容納當前的元素個數 時,就先看構造方法中傳入的容量增長量參數CapacityIncrement是否為0,如果不為0,就設置新的容量為就容量加上容量增長量,如果為0, 就設置新的容量為舊的容量的2倍,如果設置后的新容量還不夠,則直接新容量設置為傳入的參數(也就是所需的容量),而后同樣用Arrays.copyof()方法將元素拷貝到新的數組。
3、很多方法都加入了synchronized同步語句,來保證線程安全。
4、同樣在查找給定元素索引值等的方法中,源碼都將該元素的值分為null和不為null兩種情況處理,Vector中也允許元素為null。
5、其他很多地方都與ArrayList實現大同小異,Vector現在已經基本不再使用。