資源描述:
《Java 2源碼解讀》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、Java2源碼解讀:java.util.ArrayListArrayList是List接口的一個可變長數(shù)組實現(xiàn)。實現(xiàn)了所有List接口的操作,并允許存儲null值。除了沒有進(jìn)行同步,ArrayList基本等同于Vector。在Vector中幾乎對所有的方法都進(jìn)行了同步,但ArrayList僅對writeObject和readObject進(jìn)行了同步,其它比如add(Object)、remove(int)等都沒有同步。1.存儲ArrayList使用一個Object的數(shù)組存儲元素。privatetransientObjectelementData[];ArrayList實現(xiàn)了J
2、ava.io.Serializable接口,這兒的transient標(biāo)示這個屬性不需要自動序列化。下面會在writeObject()方法中詳細(xì)講解為什么要這樣作。2.add和removepublicbooleanadd(Objecto){ensureCapacity(size+1);//IncrementsmodCount!!elementData[size++]=o;returntrue;}注意這兒的ensureCapacity()方法,它的作用是保證elementData數(shù)組的長度可以容納一個新元素。在“自動變長機制”中將詳細(xì)講解。publicObjectremove
3、(intindex){RangeCheck(index);modCount++;ObjectoldValue=elementData[index];intnumMoved=size-index-1;if(numMoved>0)System.arraycopy(elementData,index+1,elementData,index,numMoved);elementData[--size]=null;//LetgcdoitsworkreturnoldValue;}RangeCheck()的作用是進(jìn)行邊界檢查。由于ArrayList采用一個對象數(shù)組存儲元素,所以在刪除一個
4、元素時需要把后面的元素前移。刪除一個元素時只是把該元素在elementData數(shù)組中的引用置為null,具體的對象的銷毀由垃圾收集器負(fù)責(zé)。modCount的作用將在下面的“iterator()中的同步”中說明。注:在前移時使用了System提供的一個實用方法:arraycopy(),在本例中可以看出System.arraycopy()方法可以對同一個數(shù)組進(jìn)行操作,這個方法是一個native方法,如果對同一個數(shù)組進(jìn)行操作時,會首先把從源部分拷貝到一個臨時數(shù)組,在把臨時數(shù)組的元素拷貝到目標(biāo)位置。3.自動變長機制在實例化一個ArrayList時,你可以指定一個初始容量。這個容量
5、就是elementData數(shù)組的初始長度。如果你使用:ArrayListlist=newArrayList();則使用缺省的容量:10。publicArrayList(){this(10);}ArrayList提供了四種add()方法,publicbooleanadd(Objecto)publicvoidadd(intindex,Objectelement)publicbooleanaddAll(Collectionc)publicbooleanaddAll(intindex,Collectionc)在每一種add()方法中,都首先調(diào)用了一個ensureCapacity(
6、intminiCapacity)方法,這個方法保證elementData數(shù)組的長度不小于miniCapacity。ArrayList的自動變長機制就是在這個方法中實現(xiàn)的。publicvoidensureCapacity(intminCapacity){modCount++;intoldCapacity=elementData.length;if(minCapacity>oldCapacity){ObjectoldData[]=elementData;intnewCapacity=(oldCapacity*3)/2+1;if(newCapacity7、newCapacity=minCapacity;elementData=newObject[newCapacity];System.arraycopy(oldData,0,elementData,0,size);}}從這個方法實現(xiàn)中可以看出ArrayList每次擴容,都擴大到原來大小的1.5倍。每種add()方法的實現(xiàn)都大同小異,下面給出add(Object)方法的實現(xiàn):publicbooleanadd(Objecto){ensureCapacity(size+1);//IncrementsmodCount!!elementD