Java集合系列-ArrayList源碼分析(2)

在上一篇文章中我們分析了ArrayList的構(gòu)造方法和添加方法;
http://www.reibang.com/p/14697d9892b6
這篇文章讓我們來(lái)看看它的移除方法壹将。

ArrayList 總共有3個(gè)移除方法
  • 移除指定位置的數(shù)據(jù)
public E remove(int index) {    
     Object[] a = array;    
     int s = size;    
     if (index >= s) {        
        throwIndexOutOfBoundsException(index, s);    
     }    
     @SuppressWarnings("unchecked") E result = (E) a[index];     
     System.arraycopy(a, index + 1, a, index, --s - index);    
     a[s] = null;  // Prevent memory leak    
     size = s;    
     modCount++;    
     return result;
}

首先如果index >= s,就會(huì)報(bào)我們經(jīng)常會(huì)碰到的數(shù)組越界異常齐帚;
下面的代碼就是把index之后的所有數(shù)據(jù)向前移動(dòng)一位追葡,然后把最后一位的數(shù)據(jù)設(shè)置為null喇颁;

  • 移除集合中的指定數(shù)據(jù)
 public boolean remove(Object object) {    
    Object[] a = array;    
    int s = size;    
    if (object != null) {        
         for (int i = 0; i < s; i++) {            
             if (object.equals(a[i])) {                
                 System.arraycopy(a, i + 1, a, i, --s - i);                
                 a[s] = null;  // Prevent memory leak                
                 size = s;                
                 modCount++;                
                 return true;            
             }        
         }    
   } else {        
        for (int i = 0; i < s; i++) {            
            if (a[i] == null) {                
                System.arraycopy(a, i + 1, a, i, --s - i);                
                a[s] = null;  // Prevent memory leak                
                size = s;                
                modCount++;                
                return true;            
            }        
        }    
   }    
   return false;
}

從第三行的邏輯開始看阱缓,首先判斷要移除的對(duì)象是否為空戳护;
如果不為空金抡,循環(huán)整個(gè)數(shù)組,找到object數(shù)組所在的位置腌且,然后邏輯就跟上面的移除類型梗肝,把object在數(shù)組中所在位置的后面的數(shù)據(jù)向前移動(dòng)一位,并且設(shè)置最后一位為null铺董。

如果為空巫击,就是找到null所在的位置禀晓,和上面的邏輯一致。
從這段代碼可以看出坝锰,ArrayList是允許添加null數(shù)據(jù)的粹懒,在移除的時(shí)候移除null數(shù)據(jù),是移除最前面的null數(shù)據(jù)顷级,找到就return凫乖。

  • 移除集合中指定集合的數(shù)據(jù)
public boolean removeAll(Collection<?> collection) {    
    boolean result = false;    
    Iterator<?> it = iterator();    
    while (it.hasNext()) {        
      if (collection.contains(it.next())) {            
        it.remove();            
        result = true;        
      }    
    }    
    return result;
}

這個(gè)移除方法并不是ArrayList自己本身的,它是AbstractCollection類的弓颈,那ArrayList和它是什么關(guān)系呢帽芽?ArrayList的父類是AbstractList,而AbstractList的父類是AbstractCollection翔冀,所以ArrayList也是AbstractCollection的子類导街。

這個(gè)方法內(nèi)部實(shí)現(xiàn)是通過(guò)迭代器來(lái)實(shí)現(xiàn)的,循環(huán)遍歷當(dāng)前的集合纤子,如果遍歷得到的數(shù)據(jù)存在于要?jiǎng)h除的collection集合當(dāng)中菊匿,就移除這條數(shù)據(jù)。

ArrayList其它常用方法
  • 集合大小
@Override 
public int size() {    
      return size;
}

就是返回標(biāo)示數(shù)量的size字段

  • 清空方法
@Override 
public void clear() {    
    if (size != 0) {        
        Arrays.fill(array, 0, size, null);        
        size = 0;        
        modCount++;    
     }
}

就是把數(shù)組所有項(xiàng)都置null

  • 包含方法
public boolean contains(Object object) {    
     Object[] a = array;    
     int s = size;    
     if (object != null) {        
       for (int i = 0; i < s; i++) {           
         if (object.equals(a[i])) {                
             return true;            
         }        
       }    
      } else {        
        for (int i = 0; i < s; i++) {            
           if (a[i] == null) {                
              return true;            
            }       
         }    
      }    
    return false;
}

大致意思就是循環(huán)數(shù)組计福,通過(guò)equals方法尋找相同的對(duì)象,所以要用到這個(gè)方法的話要重寫對(duì)象的equals方法徽职。

  • 轉(zhuǎn)化數(shù)組方法
public Object[] toArray() {    
.   int s = size;    
      Object[] result = new Object[s];    
      System.arraycopy(array, 0, result, 0, s);    
     return result;
}

大致意思就是先new一個(gè)數(shù)組象颖,然后copy數(shù)據(jù)到新數(shù)組。

至此ArrayList的常用的一些方法就分析完了姆钉。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末说订,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子潮瓶,更是在濱河造成了極大的恐慌陶冷,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件毯辅,死亡現(xiàn)場(chǎng)離奇詭異埂伦,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)思恐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門沾谜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人胀莹,你說(shuō)我怎么就攤上這事基跑。” “怎么了描焰?”我有些...
    開封第一講書人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵媳否,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)篱竭,這世上最難降的妖魔是什么力图? 我笑而不...
    開封第一講書人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮室抽,結(jié)果婚禮上搪哪,老公的妹妹穿的比我還像新娘。我一直安慰自己坪圾,他們只是感情好晓折,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著兽泄,像睡著了一般漓概。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上病梢,一...
    開封第一講書人閱讀 51,775評(píng)論 1 307
  • 那天胃珍,我揣著相機(jī)與錄音,去河邊找鬼蜓陌。 笑死觅彰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的钮热。 我是一名探鬼主播填抬,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼隧期!你這毒婦竟也來(lái)了飒责?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤仆潮,失蹤者是張志新(化名)和其女友劉穎宏蛉,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體性置,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拾并,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鹏浅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辟灰。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖篡石,靈堂內(nèi)的尸體忽然破棺而出芥喇,到底是詐尸還是另有隱情,我是刑警寧澤凰萨,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布继控,位于F島的核電站械馆,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏武通。R本人自食惡果不足惜霹崎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望冶忱。 院中可真熱鬧尾菇,春花似錦、人聲如沸囚枪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)链沼。三九已至默赂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間括勺,已是汗流浹背缆八。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留疾捍,地道東北人奈辰。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像乱豆,于是被迫代替她去往敵國(guó)和親奖恰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

推薦閱讀更多精彩內(nèi)容