Java集合類隨手記——ArrayList

一、關(guān)于remove

  • 如果是remove(int index) 會(huì)先調(diào)用
private void rangeCheck(int index) {
  if (index >= size) 
  throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}

這里有我們熟悉的IndexOutOfBoundsException數(shù)組越界異常;

  • 如果是remove(Object o) 會(huì)轉(zhuǎn)化成數(shù)組下標(biāo)調(diào)用
private void fastRemove(int index) {
   modCount++;
   int numMoved = size - index - 1;
   if (numMoved > 0)
     System.arraycopy(elementData, index+1, elementData, index,numMoved);
     elementData[--size] = null; // clear to let GC do its work
 }

最終調(diào)用System.arraycopy,以移動(dòng)后續(xù)數(shù)據(jù)覆蓋之前數(shù)據(jù)的方式實(shí)現(xiàn)刪除。

二、關(guān)于保存數(shù)據(jù)的實(shí)體

transient Object[] elementData;

之所以定義成transient是因?yàn)?,elementData默認(rèn)初始化長(zhǎng)度是10(DEFAULT_CAPACITY),當(dāng)實(shí)際長(zhǎng)度不足容量時(shí),比如2,則后8個(gè)沒(méi)存實(shí)際數(shù)據(jù)的位置是不會(huì)被序列化的。

三、關(guān)于forEach遍歷時(shí)

  • 實(shí)際上for( : ) 是先會(huì)調(diào)用內(nèi)部類Itr的hasNext判斷是否有下個(gè)元素,
    之后調(diào)用next()取值給for中的變量。
  • 這里要注意,在next時(shí)會(huì)調(diào)用
final void checkForComodification() {
  if (modCount != expectedModCount)
     throw new ConcurrentModificationException();
}

其中modCount每次對(duì)數(shù)組操作都會(huì)++,記錄操作次數(shù)。
而在迭代器遍歷的過(guò)程中,一旦發(fā)現(xiàn)這個(gè)對(duì)象的mcount和迭代器中存儲(chǔ)的mcount不一樣那就拋異常。
這就是為什么我們循環(huán)遍歷中第二次調(diào)用remove等操作會(huì)異常的原因。
Fail-Fast 機(jī)制在ArrayList,LinkedList,HashMap中都會(huì)看到。

  • modCount是定義在父類AbstractList.java中
protected transient int modCount = 0;

而expectenModCount定義在私有內(nèi)部類(迭代器的實(shí)現(xiàn))Itr中

int expectedModCount = modCount;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 【傳智播客.黑馬程序員訓(xùn)練營(yíng)成都中心】 轉(zhuǎn)載請(qǐng)注明出處 作者:成都校區(qū).堂堂老師 1. 什么時(shí)候會(huì)產(chǎn)生并發(fā)修改異常...
    OpenCoder閱讀 1,545評(píng)論 0 3
  • ArrayList 源碼分析 不知道各位朋友,還記得開(kāi)工前制定的學(xué)習(xí)目標(biāo)么? 有沒(méi)有一直為了那個(gè)目標(biāo)廢寢忘食呢?繼...
    醒著的碼者閱讀 1,532評(píng)論 6 11
  • 首先要感謝所有的親朋好友~ 很早就預(yù)約了今年的北京之行,一生中非常重要的一次旅行。 一個(gè)新的家庭誕生了,小兩口的結(jié)...
    無(wú)業(yè)遊民閱讀 636評(píng)論 0 1
  • 文|勃然滄海 圖|來(lái)自網(wǎng)絡(luò) 不知怎么的,這部看似普通...
    勃然滄海閱讀 337評(píng)論 0 1
  • 看到這個(gè)第一反應(yīng)是這個(gè) wifi改變了一代人的生活方式嗎,后面還有幾代暫且不說(shuō)。全民手機(jī)時(shí)代,走哪哪第一件事是有w...
    LittlePiggie閱讀 198評(píng)論 0 0

友情鏈接更多精彩內(nèi)容