集合篇-ArrayList

src=http___www.shouxungo.com_wp-content_uploads_2020_06_java-arraylist.jpg&refer=http___www.shouxungo.jpg

ArrayList源碼相對簡單柬祠,這個數(shù)據(jù)結(jié)構(gòu)的底層就是一個動態(tài)數(shù)組缕题,在擴容時使用System類的copy方法朗儒。初始化容量為 0 在添加元素時會將數(shù)組擴容到10查坪,以后每一次擴容均擴容1.5倍肪跋。線程不安全的容器歧蒋,多線程環(huán)境不能使用。
這里說兩個需要注意的點州既,之前面試的時候遇到過谜洽。

1、ArrayList在執(zhí)行刪除操作之后吴叶,被刪除元素后面的元素都會向前移動一位阐虚,我在這里貼一下源碼:
 public E remove(int index) {
        rangeCheck(index);

        modCount++;
        E oldValue = elementData(index);

        int numMoved = size - index - 1;
        if (numMoved > 0)
            //將被刪除元素后面的元素向前移動
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);
        //將最后一個元素置為null
        elementData[--size] = null; // clear to let GC do its work

        return oldValue;
    }

因為會自動向前進行移動所以在 for 循環(huán) 執(zhí)行刪除的時候,會出現(xiàn)意想不到的結(jié)果蚌卤。當然執(zhí)行 foreach 刪除也不行实束,會報錯:java.util.ConcurrentModificationException奥秆。這是因為在這里,foreach循環(huán)遍歷容器本質(zhì)上是使用迭代器進行遍歷的咸灿,會對修改次數(shù)modCount進行檢查构订,不允許集合進行更改操作,但是刪除的方法還是使用的ArrayList的remove()方法避矢,導(dǎo)致modCount修改悼瘾,最終拋出異常。源碼如下:

 final void checkForComodification() {
            if (modCount != expectedModCount)
                throw new ConcurrentModificationException();
 }

如果想在遍歷時執(zhí)行刪除审胸,那就只有使用迭代器亥宿。使用迭代器遍歷刪除時,能夠避免ConcurrentModificationException歹嘹。這是因為:在ArrayList中箩绍,modCount是指集合的修改次數(shù),當進行add或者delete時尺上,modCount會+1材蛛;expectedModCount是指集合的迭代器的版本號,初始值是modCount怎抛,但是當集合進行add或者delete操作時卑吭,modCount會+1,而expectedModCount不會改變马绝,所以會拋出異常豆赏。但是迭代器remove操作時,會同步expectedModCount的值富稻,把modCount的值賦予expectedModCount掷邦。所以不會拋出異常。迭代器.remove的源碼如下:

  public void remove() {
            if (lastRet < 0)
                throw new IllegalStateException();
            checkForComodification();

            try {
                ArrayList.this.remove(lastRet);
                cursor = lastRet;
                lastRet = -1;
                //對expectedModCount進行更新
                expectedModCount = modCount;
            } catch (IndexOutOfBoundsException ex) {
                throw new ConcurrentModificationException();
            }
  }
2椭赋、Arrays工具類中的一個方法:asList(T... a) 它是將數(shù)組轉(zhuǎn)換成ArrayList的
 public class Arrays {
    @SafeVarargs
    @SuppressWarnings("varargs")
    public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }
}

小心抚岗,這里的ArrayList可不是 java.util;包中的類,這個是:Arrays工具類中的一個內(nèi)部類

public class Arrays {
    
     private static class ArrayList<E> extends AbstractList<E>
        implements RandomAccess, java.io.Serializable
    {
         
    }
    
}

可以看到它也繼承AbstractList也擁有ArrayList中的抽象方法哪怔,但是這個內(nèi)部類是沒有將這些方法實現(xiàn)的宣蔚,我們再看一下AbstractList中的add方法

 public void add(int index, E element) {
        throw new UnsupportedOperationException();
 }
 public E remove(int index) {
        throw new UnsupportedOperationException();
 }

一目了然,直接拋出異常认境。也就是我們在使用這個工具類轉(zhuǎn)換出來的ArrayList時是不能執(zhí)行添加和刪除操作的胚委。只能執(zhí)行修改操作

public E set(int index, E element) {
            E oldValue = a[index];
            a[index] = element;
            return oldValue;
}
3、總結(jié):

1叉信、刪除時需要注意元素會自動向前移動亩冬;

2、foreach刪除是語法糖硼身,本質(zhì)上還是使用的迭代器硅急,會出現(xiàn)ConcurrentModificationException異常枢冤;

3、刪除時盡量使用迭代器铜秆。

我是巴哥淹真,我一定能進大廠!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末连茧,一起剝皮案震驚了整個濱河市核蘸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌啸驯,老刑警劉巖客扎,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異罚斗,居然都是意外死亡徙鱼,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門针姿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來袱吆,“玉大人,你說我怎么就攤上這事距淫〗嗜蓿” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵榕暇,是天一觀的道長蓬衡。 經(jīng)常有香客問我,道長彤枢,這世上最難降的妖魔是什么狰晚? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮缴啡,結(jié)果婚禮上壁晒,老公的妹妹穿的比我還像新娘。我一直安慰自己盟猖,他們只是感情好讨衣,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布换棚。 她就那樣靜靜地躺著式镐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪固蚤。 梳的紋絲不亂的頭發(fā)上娘汞,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天,我揣著相機與錄音夕玩,去河邊找鬼你弦。 笑死惊豺,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的禽作。 我是一名探鬼主播尸昧,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼旷偿!你這毒婦竟也來了烹俗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤萍程,失蹤者是張志新(化名)和其女友劉穎幢妄,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體茫负,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡蕉鸳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了忍法。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片潮尝。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖饿序,靈堂內(nèi)的尸體忽然破棺而出衍锚,到底是詐尸還是另有隱情,我是刑警寧澤嗤堰,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布戴质,位于F島的核電站,受9級特大地震影響踢匣,放射性物質(zhì)發(fā)生泄漏告匠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一离唬、第九天 我趴在偏房一處隱蔽的房頂上張望后专。 院中可真熱鬧,春花似錦输莺、人聲如沸戚哎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽型凳。三九已至,卻和暖如春嘱函,著一層夾襖步出監(jiān)牢的瞬間甘畅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留疏唾,地道東北人蓄氧。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像槐脏,于是被迫代替她去往敵國和親喉童。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

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