【Java集合源码剖析】Vector源码剖析

王朝学院·作者佚名  2016-05-28
窄屏简体版  字體: 小  |  中  |  大  |  超大  

【java集合源码剖析】Vector源码剖析转载请注明出处:http://blog.csdn.net/ns_code/article/details/35793865

Vector简介 Vector也是基于数组实现的,是一个动态数组,其容量能自动增长。

Vector是JDK1.0引入了,它的很多实现方法都加入了同步语句,因此是线程安全的(其实也只是相对安全,有些时候还是要加入同步语句来保证线程的安全),可以用于多线程环境。

Vector没有丝线Serializable接口,因此它不支持序列化,实现了Cloneable接口,能被克隆,实现了Randomaccess接口,支持快速随机访问。

Vector源码剖析 Vector的源码如下(加入了比较详细的注释):

[java] view plaincopypackagejava.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);//新建一个数组,数组容量是initialCapacitythis.elementData=newObject[initialCapacity];//设置容量增长系数this.capacityIncrement=capacityIncrement;}//指定集合的Vector构造函数。publicVector(Collection<?extendsE>c){//获取“集合(c)”的数组,并将其赋值给elementDataelementData=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的改变统计数+1modCount++;ensureCapacityHelper(minCapacity);}//设置容量值为newSizepublicsynchronizedvoidsetSize(intnewSize){modCount++;if(newSize>elementCount){//若"newSize大于Vector容量",则调整Vector的大小。ensureCapacityHelper(newSize);}else{//若"newSize小于/等于Vector容量",则将newSize位置开始的元素都设置为nullfor(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(){//通过匿名类实现EnumerationreturnnewEnumeration<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)。//若找到,则返回元素的索引值;否则,返回-1publicsynchronizedintindexOf(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位置的元素值为objpublicsynchronizedvoidsetElementAt(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中的全部元素设为nullfor(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,sinceweareCloneablethrownewInternalError();}}//返回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中的元素opublicbooleanremove(Objecto){returnremoveElement(o);}//在index位置添加元素elementpublicvoidadd(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;//Letgcdoitsworkreturn(E)oldValue;}//清空Vectorpublicvoidclear(){removeAllElements();}//返回Vector是否包含集合cpublicsynchronizedbooleancontainsAll(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);//LetgcdoitsworkintnewElementCount=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现在已经基本不再使用。

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航