天天看點

有關ArrayList常用方法的源碼解析

對于ArrayList的初始化有三種方式:

對于第一種預設的構造方法,ArrayList并沒有初始化容量大小,而是将清單的元素資料引用指向了一個空數組。

  與JDK1.6不同的是,JDK1.6即時是在調用預設的構造方法時,也會初始化容量大小,JDK1.7當然會帶來一定的好處,如果初始化而不使用就白白浪費了存儲空間,等到添加的時候再初始化容量大小即可。

  對于第二種構造方法,則直接建立一個指定大小的數組,将清單的元素數組引用指向它。

  第三種構造方法,能将一個集合作為參數傳遞,但集合中的元素必須繼承自ArrayList中的元素。

  上面提到了一個bug,也就是說将一個集合轉換為數組的時候可能錯誤地不會傳回Object[],舉例說明。

  運作結果:

有關ArrayList常用方法的源碼解析

  上面的這個例子就說明了toArray并不一定總是傳回Object[],傳回的Object[]時,Object元素就不能插入,故JDK在“6260652”中修複了這個bug。

  接下來看元素插入以及删除等其它方法。

  在ensureEcplicitCapacity方法中有一個modCount(modify count)變量進行了自增。

  這個變量不僅在add方法中會自增,隻要是在增加或者删除等對ArrayList結構産生了變化都會記錄加1,這樣做的原因和多線程下Iterator疊代器周遊有關。在AbstractList$Itr中也有一個變量與之對應。

  在AbstractList$Itr#next中調用了checkForComodification方法。

  如果目前運作環境是單線程,不論對清單進行何種操作何時增加、修改、删除等,excpectedModCount總是會等于modCount,但是如果目前運作環境是多線程,很有可能一個線程在疊代周遊,而另一個線程在對其進行新增或者修改等,JDK則不允許這麼做,此時則會抛出ConcurrentModificationException異常,這就是modCount變量在此起的作用。

回到ArrayList#add方法,當清單容量不足時,此時會調用grow方法進行擴容。

  ArrayList擷取指定索引位置的元素get方法。

  由于ArrayList是由基于數組實作,故此方法較為簡單,判斷是否越界,沒有則根據數組下标來索引傳回元素即可。remove方法删除指定位置的元素。  

本文轉自xmgdc51CTO部落格,原文連結:http://blog.51cto.com/12953214/1942286 ,如需轉載請自行聯系原作者