欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

ArrayList類源碼分析

系統 1828 0

ArrayList源碼分析 ?

?? ArrayList是以數組為基礎實現的一個動態數組容器,通過以下的代碼分析可知,一方面在ArrayList中添加或者刪除元素(除了在數組容器末尾添加或者刪除元素),是需要移動大量元素的借助System.arraycopy()來實現拷貝移動,另一方面,由于數組實現基礎,可依靠數組下標,可以實現隨機訪問,當然查找具體的元素,還是需要循環去查找的,再者ArrayList不是thread-safe的,在代碼中無論是add,remove,get,都沒有任何同步措施,在多線程環境下需要自己確保thread-safe。由此可知ArrayList適用于在任意位置添加,刪除元素不多,要求隨機訪問的應用場景。 ?

? 代碼分析主要羅列:ArrayList構造函數,remove(), add(), get() ?

1.ArrayList構造函數 ?

?? private transient E[] elementData;ArrayList使用對象數組元素來作為內部實現的基礎數據結構。 ?

Java代碼 ? ?
  1. //ArrayList是以數組為基礎實現的,采用的泛型編程,數組元素都是Object類型 ??
  2. //初始化時主要是構造指定大小的數組,用于存儲對象元素 ??
  3. public ?ArrayList( int ?initialCapacity){??
  4. ?????? super ();??
  5. ?????? if ?(initialCapacity?<? 0 )??
  6. ?????????? throw ? new ?IllegalArgumentException( "Illegal?Capacity:?" +??
  7. ?????????????????????????????????????????????initialCapacity);??
  8. ?????? this .elementData?=?(E[]) new ?Object[initialCapacity];??
  9. }??
Java代碼 ? ? 收藏代碼
  1. //ArrayList是以數組為基礎實現的,采用的泛型編程,數組元素都是Object類型 ??
  2. //初始化時主要是構造指定大小的數組,用于存儲對象元素 ??
  3. public ?ArrayList( int ?initialCapacity){??
  4. ?????? super ();??
  5. ?????? if ?(initialCapacity?<? 0 )??
  6. ?????????? throw ? new ?IllegalArgumentException( "Illegal?Capacity:?" +??
  7. ?????????????????????????????????????????????initialCapacity);??
  8. ?????? this .elementData?=?(E[]) new ?Object[initialCapacity];??
  9. }??



?

Java代碼 ? ?
  1. //默認情況下ArrayList實現依賴的數組長度為10 ??
  2. ??? public ?ArrayList()?{??
  3. ???????? this ( 10 );??
  4. ???}??
Java代碼 ? ? 收藏代碼
  1. //默認情況下ArrayList實現依賴的數組長度為10 ??
  2. ??? public ?ArrayList()?{??
  3. ???????? this ( 10 );??
  4. ???}??


?? ?

?

Java代碼 ? ?
  1. //使用另一個集合中的元素來初始化當前的List ??
  2. ? public ?ArrayList(Collection<?? extends ?E>?c)?{??
  3. ??????size?=?c.size();??
  4. ?????? //?Allow?10%?room?for?growth ??
  5. ??????elementData?=?(E[]) new ?Object[??
  6. ????????????????????( int )Math.min((size*110L)/ 100 ,Integer.MAX_VALUE)];???
  7. ??????c.toArray(elementData);??
  8. ??}??
Java代碼 ? ? 收藏代碼
  1. //使用另一個集合中的元素來初始化當前的List ??
  2. ? public ?ArrayList(Collection<?? extends ?E>?c)?{??
  3. ??????size?=?c.size();??
  4. ?????? //?Allow?10%?room?for?growth ??
  5. ??????elementData?=?(E[]) new ?Object[??
  6. ????????????????????( int )Math.min((size*110L)/ 100 ,Integer.MAX_VALUE)];???
  7. ??????c.toArray(elementData);??
  8. ??}??




2. ensureCapaciyt(int) | add(E) | add(int, E)分析 ?

?? ensureCapacity主要用來實現數組的動態擴容,每次擴容為原來大小的1.5倍,在add操作前調用,以確保數組容量夠用。 ?

Java代碼 ? ?
  1. public ? void ?ensureCapacity( int ?minCapacity)?{??
  2. ??
  3. ????modCount++;??
  4. ???? int ?oldCapacity?=?elementData.length;??
  5. ??????????
  6. ???????? //如果當前數組的實際容量(oldCapacity)比當前要求的容量要小(minCapacity) ??
  7. ???????? //就需要進行擴容,申請新的數組空間,大小為minCapacity,并將原來數組空間中的元素拷貝 ??
  8. ???????? //到新的數組空間當中。???????? ??
  9. ???? if ?(minCapacity?>?oldCapacity)?{??
  10. ????????Object?oldData[]?=?elementData;??
  11. ????????????
  12. ???????????? //擴容因子為:1.5倍左右,每次需要擴容時,會將空間擴展為原來的1.5倍大小 ??
  13. ???????? int ?newCapacity?=?(oldCapacity?*? 3 )/ 2 ?+? 1 ;??
  14. ??
  15. ???????????? if ?(newCapacity?<?minCapacity)??
  16. ????????newCapacity?=?minCapacity;??
  17. ??
  18. ????????elementData?=?(E[]) new ?Object[newCapacity];??
  19. ????????????????
  20. ???????????? //將數組元素轉移到新申請的數組空間當中 ??
  21. ????????System.arraycopy(oldData,? 0 ,?elementData,? 0 ,?size);??
  22. ????}??
  23. }??
Java代碼 ? ? 收藏代碼
  1. public ? void ?ensureCapacity( int ?minCapacity)?{??
  2. ??
  3. ????modCount++;??
  4. ???? int ?oldCapacity?=?elementData.length;??
  5. ??????????
  6. ???????? //如果當前數組的實際容量(oldCapacity)比當前要求的容量要小(minCapacity) ??
  7. ???????? //就需要進行擴容,申請新的數組空間,大小為minCapacity,并將原來數組空間中的元素拷貝 ??
  8. ???????? //到新的數組空間當中。???????? ??
  9. ???? if ?(minCapacity?>?oldCapacity)?{??
  10. ????????Object?oldData[]?=?elementData;??
  11. ????????????
  12. ???????????? //擴容因子為:1.5倍左右,每次需要擴容時,會將空間擴展為原來的1.5倍大小 ??
  13. ???????? int ?newCapacity?=?(oldCapacity?*? 3 )/ 2 ?+? 1 ;??
  14. ??
  15. ???????????? if ?(newCapacity?<?minCapacity)??
  16. ????????newCapacity?=?minCapacity;??
  17. ??
  18. ????????elementData?=?(E[]) new ?Object[newCapacity];??
  19. ????????????????
  20. ???????????? //將數組元素轉移到新申請的數組空間當中 ??
  21. ????????System.arraycopy(oldData,? 0 ,?elementData,? 0 ,?size);??
  22. ????}??
  23. }??



? add(E)操作是向集合ArrayList中存儲元素,在當前數組容器的尾部添加,不需要移動元素,返回true。 ?

Java代碼 ? ?
  1. public ? boolean ?add(E?o)?{??
  2. ???????? //調用ensureCapacity確保當前容量不小于(size?+?1),size為容器中當前存儲的實際元素個數. ??
  3. ????ensureCapacity(size?+? 1 );???
  4. ???????? //將對象引用o保存到數組容器中,并++size. ??
  5. ????elementData[size++]?=?o;??
  6. ???? return ? true ;??
  7. }??
Java代碼 ? ? 收藏代碼
  1. public ? boolean ?add(E?o)?{??
  2. ???????? //調用ensureCapacity確保當前容量不小于(size?+?1),size為容器中當前存儲的實際元素個數. ??
  3. ????ensureCapacity(size?+? 1 );???
  4. ???????? //將對象引用o保存到數組容器中,并++size. ??
  5. ????elementData[size++]?=?o;??
  6. ???? return ? true ;??
  7. }??



add(int , E)在ArrayList中的指定位置index,保存對象element. ?

Java代碼 ? ?
  1. public ? void ?add( int ?index,?E?element)?{??
  2. ??
  3. ???????? //檢測指定位置的合法性 ??
  4. ???? if ?(index?>?size?||?index?<? 0 )??
  5. ???????? throw ? new ?IndexOutOfBoundsException(??
  6. ???????? "Index:?" +index+ ",?Size:?" +size);??
  7. ??
  8. ????ensureCapacity(size+ 1 );??
  9. ??????????
  10. ???????? //將數組容器elementData中從index位置開始的元素,依次往后移動一個位置 ??
  11. ???????? //也就是說經過arraycopy()后,index位置被空出來 ??
  12. ????System.arraycopy(elementData,?index,?elementData,?index?+? 1 ,??
  13. ?????????????size?-?index);??
  14. ??
  15. ???????? //將對象element存儲到數組容器的index位置上 ??
  16. ????elementData[index]?=?element;??
  17. ????size++;??
  18. }??
Java代碼 ? ? 收藏代碼
  1. public ? void ?add( int ?index,?E?element)?{??
  2. ??
  3. ???????? //檢測指定位置的合法性 ??
  4. ???? if ?(index?>?size?||?index?<? 0 )??
  5. ???????? throw ? new ?IndexOutOfBoundsException(??
  6. ???????? "Index:?" +index+ ",?Size:?" +size);??
  7. ??
  8. ????ensureCapacity(size+ 1 );??
  9. ??????????
  10. ???????? //將數組容器elementData中從index位置開始的元素,依次往后移動一個位置 ??
  11. ???????? //也就是說經過arraycopy()后,index位置被空出來 ??
  12. ????System.arraycopy(elementData,?index,?elementData,?index?+? 1 ,??
  13. ?????????????size?-?index);??
  14. ??
  15. ???????? //將對象element存儲到數組容器的index位置上 ??
  16. ????elementData[index]?=?element;??
  17. ????size++;??
  18. }??





3. remove(int) | remove(Object) | fastRemove(int) | removeRange(int,int)分析 ?

? remove(int)用于刪除ArrayList數組容器中指定位置int上的元素,并返回此元素. ?

Java代碼 ? ?
  1. public ?E?remove( int ?index)?{??
  2. ??
  3. ????RangeCheck(index);??
  4. ??
  5. ????modCount++;??
  6. ??
  7. ????E?oldValue?=?elementData[index];??
  8. ???????? //numMoved需要移動的元素個數,也就是index后面的所有的元素個數 ??
  9. ???? int ?numMoved?=?size?-?index?-? 1 ;??
  10. ??
  11. ???????? //將index后面的所有元素全部往前依次移動一個位置 ??
  12. ???? if ?(numMoved?>? 0 )??
  13. ????????System.arraycopy(elementData,?index+ 1 ,?elementData,?index,??
  14. ?????????????????numMoved);??
  15. ??
  16. ???????? //經過arraycopy的移位,數組容器的最個位置被騰空, ??
  17. ???????? //但是仍然持有某個對象的引用,需要把這個多余的引用置為null. ??
  18. ????????elementData[--size]?=? null ;? //?Let?gc?do?its?work ??
  19. ??
  20. ???? return ?oldValue;??
  21. }??
Java代碼 ? ? 收藏代碼
  1. public ?E?remove( int ?index)?{??
  2. ??
  3. ????RangeCheck(index);??
  4. ??
  5. ????modCount++;??
  6. ??
  7. ????E?oldValue?=?elementData[index];??
  8. ???????? //numMoved需要移動的元素個數,也就是index后面的所有的元素個數 ??
  9. ???? int ?numMoved?=?size?-?index?-? 1 ;??
  10. ??
  11. ???????? //將index后面的所有元素全部往前依次移動一個位置 ??
  12. ???? if ?(numMoved?>? 0 )??
  13. ????????System.arraycopy(elementData,?index+ 1 ,?elementData,?index,??
  14. ?????????????????numMoved);??
  15. ??
  16. ???????? //經過arraycopy的移位,數組容器的最個位置被騰空, ??
  17. ???????? //但是仍然持有某個對象的引用,需要把這個多余的引用置為null. ??
  18. ????????elementData[--size]?=? null ;? //?Let?gc?do?its?work ??
  19. ??
  20. ???? return ?oldValue;??
  21. }??


remove(Object)刪除指定的對象Object,在數組容器中,需要特別處理null對象,過程都是,首先在數組容器中循環查找某個對象,如果查找到則調用fastRemove()進行刪除。 ?

Java代碼 ? ?
  1. public ? boolean ?remove(Object?o)?{??
  2. ???? if ?(o?==? null )?{??
  3. ???????????? for ?( int ?index?=? 0 ;?index?<?size;?index++)??
  4. ???????? if ?(elementData[index]?==? null )?{??
  5. ????????????fastRemove(index);??
  6. ???????????? return ? true ;??
  7. ????????}??
  8. ????}? else ?{??
  9. ???????????? //注意比較兩個對象是否相等調用的是equals(), ??
  10. ???????????? //如果此類對象沒有重寫equals() ??
  11. ???????????? //比較的是是否引用同一個對象,如果有重寫,將比較對象內部狀態. ??
  12. ???????? for ?( int ?index?=? 0 ;?index?<?size;?index++)??
  13. ???????? if ?(o.equals(elementData[index]))?{??
  14. ????????????fastRemove(index);??
  15. ???????????? return ? true ;??
  16. ????????}??
  17. ????????}??
  18. ???? return ? false ;??
  19. ????}??
Java代碼 ? ? 收藏代碼
  1. public ? boolean ?remove(Object?o)?{??
  2. ???? if ?(o?==? null )?{??
  3. ???????????? for ?( int ?index?=? 0 ;?index?<?size;?index++)??
  4. ???????? if ?(elementData[index]?==? null )?{??
  5. ????????????fastRemove(index);??
  6. ???????????? return ? true ;??
  7. ????????}??
  8. ????}? else ?{??
  9. ???????????? //注意比較兩個對象是否相等調用的是equals(), ??
  10. ???????????? //如果此類對象沒有重寫equals() ??
  11. ???????????? //比較的是是否引用同一個對象,如果有重寫,將比較對象內部狀態. ??
  12. ???????? for ?( int ?index?=? 0 ;?index?<?size;?index++)??
  13. ???????? if ?(o.equals(elementData[index]))?{??
  14. ????????????fastRemove(index);??
  15. ???????????? return ? true ;??
  16. ????????}??
  17. ????????}??
  18. ???? return ? false ;??
  19. ????}??



fastRemove(int index)是相對于remove(int index)來說的,因為不需要進行index合法性檢查和返回被刪除的元素,所以它可以稱為fast remove.fastRemove是private不能被外界訪問,只是在remove(Object o)中被調用,因為remove(Object o)在調用fastRemove()時候已經確定了此對象的確存在才進行fastRemove(),所以是安全的,不需要檢查。 ?

Java代碼 ? ?
  1. private ? void ?fastRemove( int ?index)?{??
  2. ???????modCount++;??
  3. ??????? int ?numMoved?=?size?-?index?-? 1 ;??
  4. ??????? if ?(numMoved?>? 0 )??
  5. ???????????System.arraycopy(elementData,?index+ 1 ,?elementData,?index,???
  6. ????????????????????????????numMoved);??
  7. ???????elementData[--size]?=? null ;? //?Let?gc?do?its?work ??
  8. ?}??
Java代碼 ? ? 收藏代碼
  1. private ? void ?fastRemove( int ?index)?{??
  2. ???????modCount++;??
  3. ??????? int ?numMoved?=?size?-?index?-? 1 ;??
  4. ??????? if ?(numMoved?>? 0 )??
  5. ???????????System.arraycopy(elementData,?index+ 1 ,?elementData,?index,???
  6. ????????????????????????????numMoved);??
  7. ???????elementData[--size]?=? null ;? //?Let?gc?do?its?work ??
  8. ?}??




removeRange(int, int)用于刪除數組容器中指定下標范圍內的元素 ?

Java代碼 ? ?
  1. ??? protected ? void ?removeRange( int ?fromIndex,? int ?toIndex)?{??
  2. modCount++;??
  3. int ?numMoved?=?size?-?toIndex;??
  4. ??????? //將從toIndex開始的元素依次拷貝到fromIndex位置上。 ??
  5. ???????System.arraycopy(elementData,?toIndex,?elementData,?fromIndex,??
  6. ????????????????????????numMoved);??
  7. ??
  8. //?Let?gc?do?its?work ??
  9. ??????? //newSize為刪除指定范圍元素后,容器中所剩下的元素個數。 ??
  10. int ?newSize?=?size?-?(toIndex-fromIndex);??
  11. ??????? //將持有多余引用的元素位置(從size-1到newSize?-?1)置為null, ??
  12. ??????? //讓GC能夠及時回收垃圾對象. ??
  13. while ?(size?!=?newSize)??
  14. ????elementData[--size]?=? null ;??
  15. ???}??
Java代碼 ? ? 收藏代碼
  1. ??? protected ? void ?removeRange( int ?fromIndex,? int ?toIndex)?{??
  2. modCount++;??
  3. int ?numMoved?=?size?-?toIndex;??
  4. ??????? //將從toIndex開始的元素依次拷貝到fromIndex位置上。 ??
  5. ???????System.arraycopy(elementData,?toIndex,?elementData,?fromIndex,??
  6. ????????????????????????numMoved);??
  7. ??
  8. //?Let?gc?do?its?work ??
  9. ??????? //newSize為刪除指定范圍元素后,容器中所剩下的元素個數。 ??
  10. int ?newSize?=?size?-?(toIndex-fromIndex);??
  11. ??????? //將持有多余引用的元素位置(從size-1到newSize?-?1)置為null, ??
  12. ??????? //讓GC能夠及時回收垃圾對象. ??
  13. while ?(size?!=?newSize)??
  14. ????elementData[--size]?=? null ;??
  15. ???}??



4. get(int) ?

get(int)用于獲取ArrayList指定位置的元素,就是從數組中指定位置上取元素。 ?

Java代碼 ? ?
  1. public ?E?get( int ?index)?{??
  2. ??
  3. ???????? //RangeCheck(index)用于檢查index在數組元素中位置是否合法(必須index?<?size) ??
  4. ????RangeCheck(index);??
  5. ??
  6. ???? return ?elementData[index];??
  7. }??
Java代碼 ? ? 收藏代碼
  1. public ?E?get( int ?index)?{??
  2. ??
  3. ???????? //RangeCheck(index)用于檢查index在數組元素中位置是否合法(必須index?<?size) ??
  4. ????RangeCheck(index);??
  5. ??
  6. ???? return ?elementData[index];??
  7. }??

ArrayList類源碼分析


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久久精品re | 羞羞的动漫在线观看 | 污视频免费网站 | 一级毛片一级毛片一级毛片一级毛片 | 国产一级影视 | 国产精品久久久999 午夜免费 | 三级欧美日韩 | 精品一区二区视频 | 最新的黄色网址 | 九九99久久 | 一级女性大黄生活片免费 | 成人看的一级毛片 | 91免费在线 | 免费在线观看的毛片 | 日韩欧美国产中文 | 国产精品色在线网站 | 欧美成人性色区 | 久爱视频www在线播放 | 日本高清午夜色wwwσ | 91最新在线| 一级片片| 欧美极品欧美精品欧美视频 | 久久亚洲一区二区 | 中文在线视频 | 久久综合九色婷婷97 | 香蕉久草在线 | 91久久精品一区二区二区 | 久久精品国内一区二区三区 | 婷婷久久激情啪啪 | 欧美成人免费午夜全 | 光根电影院 | 亚卅毛片 | 亚洲福利一区福利三区 | 91tv在线观看 | 午夜视频啪啪 | 狠狠色丁香婷婷久久综合考虑 | 草草视频在线观看 | 天堂va在线高清一区 | 在线精品国内外视频 | 欧美精品在线不卡 | xxxxhd73国产|