Java-ArrayList各函數(shù)源碼小結(jié)

復(fù)制一時爽,一直復(fù)制一直爽照棋。

github地址:android_interview

雖然從github復(fù)制的资溃,但自己再寫一遍能更好的理解和加深記憶。此文章僅作為個人學(xué)習(xí)的知識點小結(jié)烈炭,不做任何其他用途溶锭。

1、概括

ArrayList是一個比較簡單的數(shù)據(jù)結(jié)構(gòu)符隙,最重要的一點就是它的自動擴容趴捅,
可以認(rèn)為就是我們常說的“動態(tài)數(shù)組”。

實際上霹疫,ArrayList內(nèi)部就是以數(shù)組實現(xiàn)的驻售,這個數(shù)組有容量限制。超出限制時會增加50%容量更米,用System.arraycopy()復(fù)制到新的數(shù)組欺栗,因此最好能給出數(shù)組大小的預(yù)估值。默認(rèn)第一次插入元素時創(chuàng)建大小為10的數(shù)組征峦。(注意:只是容量為10迟几,不是size為10,有區(qū)別的

按數(shù)組下標(biāo)訪問元素—get(i)/set(i,e) 的性能很高栏笆,這是數(shù)組的基本優(yōu)勢类腮。直接在數(shù)組末尾加入元素—add(e)的性能也高,但如果按下標(biāo)插入蛉加、刪除元素—add(i,e), remove(i), remove(e)蚜枢,則要用System.arraycopy()來移動部分受影響的元素,性能就變差了针饥,這是基本劣勢厂抽。

2、add函數(shù)

在ArrayList中增加元素丁眼,使用 add 函數(shù)筷凤。他會將元素放到末尾。具體實現(xiàn)如下:

public boolean add(E e) {
    ensureCapacityInternal(size + 1); // Increments modCount!!
    elementData[size++] = e;
    return true;
}

可以看到其最核心的內(nèi)容就是 ensureCapacityInternal 方法 苞七。這個函數(shù)其實就是自動擴容機制的核心藐守。然后來看一下他的具體實現(xiàn):

private void ensureCapacityInternal(int minCapacity) {
    if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
        minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
    }
    ensureExplicitCapacity(minCapacity);
}

private void ensureExplicitCapacity(int minCapacity) {
    modCount++;
    // 溢出
    if (minCapacity - elementData.length > 0)
        grow(minCapacity);
}

private void grow(int minCapacity) {
    // 溢出代碼
    int oldCapacity = elementData.length;
    // 擴展為原來的1.5倍
    int newCapacity = oldCapacity + (oldCapacity >> 1);
    // 如果擴為1.5倍還不滿足需求,直接擴為需求值
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
    // minCapacity is usually close to size, so this is a win:
    elementData = Arrays.copyOf(elementData, newCapacity);
}

也就是說蹂风,當(dāng)增加數(shù)據(jù)的時候卢厂,如果ArrayList的大小已經(jīng)不滿足需求時,那么就將數(shù)組變?yōu)樵L度的1.5倍惠啄,之后的操作就是把老的數(shù)組拷到新的數(shù)組里面慎恒。例如任内,默認(rèn)的數(shù)組大小是10,也就是說當(dāng)我們 add 10個元素之后巧号,再進行一次add時,就會發(fā)生自動擴容姥闭,數(shù)組長度由10變?yōu)榱?5丹鸿。

3、set和get函數(shù)

Array的set和get函數(shù)比較簡單棚品,先做index檢查靠欢,然后執(zhí)行賦值或訪問操作,其中rangeCheck函數(shù)檢查是否越界問題铜跑,越界就拋出異常门怪,中斷運行:

public E set(int index, E element) {
    rangeCheck(index);
    E oldValue = elementData(index);
    elementData[index] = element;
    return oldValue;
}

public E get(int index) {
    rangeCheck(index);
    return elementData(index);
}

4、remove函數(shù)

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;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锅纺,一起剝皮案震驚了整個濱河市掷空,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌囤锉,老刑警劉巖坦弟,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異官地,居然都是意外死亡酿傍,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門驱入,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赤炒,“玉大人,你說我怎么就攤上這事亏较≥喊” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵雪情,是天一觀的道長癣朗。 經(jīng)常有香客問我,道長旺罢,這世上最難降的妖魔是什么旷余? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮扁达,結(jié)果婚禮上正卧,老公的妹妹穿的比我還像新娘。我一直安慰自己跪解,他們只是感情好炉旷,可當(dāng)我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般窘行。 火紅的嫁衣襯著肌膚如雪饥追。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天罐盔,我揣著相機與錄音但绕,去河邊找鬼。 笑死惶看,一個胖子當(dāng)著我的面吹牛捏顺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播纬黎,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼幅骄,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了本今?” 一聲冷哼從身側(cè)響起拆座,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎冠息,沒想到半個月后懂拾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡铐达,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年岖赋,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瓮孙。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡唐断,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出杭抠,到底是詐尸還是另有隱情脸甘,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布偏灿,位于F島的核電站丹诀,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏翁垂。R本人自食惡果不足惜铆遭,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望沿猜。 院中可真熱鬧枚荣,春花似錦、人聲如沸啼肩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至害碾,卻和暖如春矢劲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背慌随。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工芬沉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人儒陨。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓花嘶,卻偏偏與公主長得像笋籽,于是被迫代替她去往敵國和親蹦漠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,092評論 2 355

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