亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

ArrayList類源碼分析

系統 1775 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條評論
主站蜘蛛池模板: 久久99亚洲精品久久 | 四虎4hu永久免费视频大全 | 99久久精品免费看国产麻豆 | 久久三级视频 | 色婷婷一区二区三区四区成人 | 乱码一区二区三区完整视频 | 国产伦精品一区二区三区网站 | 久久桃花网 | 日本一区二区三区免费在线观看 | 欧美亚洲国产视频 | 久青草视频免费观看青 | 久久午夜一区二区 | 2022国产成人综合精品 | 九九视频免费在线观看 | 中文字幕在线最新在线不卡 | 中文字幕精品视频在线观 | 激情爱爱视频 | 免费网站啪啪大全 | 欧美精品国产一区二区 | 中文字幕国产在线 | 激情影院免费看 | 欧美一区二区三区久久久人妖 | 亚洲不卡视频在线观看 | 午夜看一级特黄a大片 | 天天操夜夜操天天操 | 91色综合久久 | 天天色综网 | 国产天天在线 | 国产综合成色在线视频 | 中文字幕日韩在线 | 日韩精品免费一区二区 | 久久精品成人免费网站 | 一本色道久久综合亚洲精品高清 | 中文字幕热久久久久久久 | 福利视频午夜 | 91视频免费入口 | 97视频网站 | 亚洲精品免费在线 | 成人黄色网 | 国产欧美成人xxx视频 | 日韩精品一区二区在线观看 |