Java Collections Framework - ArrayList

簡書 占小狼
轉(zhuǎn)載請注明原創(chuàng)出處,謝謝!

定義

ArrayList底層以數(shù)組實(shí)現(xiàn),允許重復(fù),默認(rèn)第一次插入元素時創(chuàng)建數(shù)組的大小為10,超出限制時會增加50%的容量,每次擴(kuò)容都底層采用System.arrayCopy()復(fù)制到新的數(shù)組,初始化時最好能給出數(shù)組大小的預(yù)估值。

package java.util;
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable { 
    private static final int DEFAULT_CAPACITY = 10; 
    private static final Object[] EMPTY_ELEMENTDATA = {}; 
    private transient Object[] elementData; 
    private int size;
    //其余省略
}

概述

按數(shù)組下標(biāo)訪問元素—get(i)/set(i,e) 的性能很高,這是數(shù)組的基本優(yōu)勢。

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

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

直接在數(shù)組末尾加入元素—add(e)的性能也高,但如果按下標(biāo)插入、刪除元素—add(i,e), remove(i), remove(e),則要用System.arraycopy()來移動部分受影響的元素,性能就變差了,這是劣勢

ArrayList中有一個方法trimToSize()用來縮小elementData數(shù)組的大小,這樣可以節(jié)約內(nèi)存:

public void trimToSize() { 
    modCount++; 
    if (size < elementData.length) { 
        elementData = Arrays.copyOf(elementData, size); 
    } 
}

考慮這樣一種情形,當(dāng)某個應(yīng)用需要,一個ArrayList擴(kuò)容到比如size=10000,之后經(jīng)過一系列remove操作size=15,在后面的很長一段時間內(nèi)這個ArrayList的size一直保持在<100以內(nèi),那么就造成了很大的空間浪費(fèi),這時候建議顯式調(diào)用一下trimToSize()這個方法,以優(yōu)化一下內(nèi)存空間。 ??
或者在一個ArrayList中的容量已經(jīng)固定,但是由于之前每次擴(kuò)容都擴(kuò)充50%,所以有一定的空間浪費(fèi),可以調(diào)用trimToSize()消除這些空間上的浪費(fèi)。

RandomAccess

這個接口有什么用?
實(shí)現(xiàn)RandomAccess接口的集合有:ArrayList, AttributeList, CopyOnWriteArrayList, RoleList, RoleUnresolvedList, Stack, Vector等。
在RandomAccess接口的注釋中有這么一段話:

for (int i=0, n=list.size(); i < n; i++) {     
    list.get(i);
}
runs faster than this loop:
for (Iterator i=list.iterator(); i.hasNext(); ) { 
   i.next();
}

說明實(shí)現(xiàn)了RandomAccess接口的集合,在數(shù)據(jù)量很大的情況下,采用迭代器遍歷比較慢。


和LinkedList的區(qū)別

1、ArrayList是實(shí)現(xiàn)了基于動態(tài)數(shù)組的數(shù)據(jù)結(jié)構(gòu),LinkedList基于鏈表的數(shù)據(jù)結(jié)構(gòu)。
2、對于隨機(jī)訪問get和set,ArrayList覺得優(yōu)于LinkedList,因為LinkedList要移動指針。
3、對于新增和刪除操作add和remove(不是在尾部添加刪除),LinkedList比較占優(yōu)勢,因為ArrayList要移動數(shù)據(jù)。


和Vector的區(qū)別

1、Vector和ArrayList幾乎是完全相同的,唯一的區(qū)別在于Vector是同步類(synchronized),屬于強(qiáng)同步類。因此開銷就比ArrayList要大,訪問要慢。正常情況下,大多數(shù)的Java程序員使用ArrayList而不是Vector,因為同步完全可以由程序員自己來控制。
2、Vector每次擴(kuò)容請求其大小的2倍空間,而ArrayList是1.5倍。
3、Vector還有一個子類Stack.

END。
我是占小狼。
在魔都艱苦奮斗,白天是上班族,晚上是知識服務(wù)工作者。
讀完我的文章有收獲,記得關(guān)注和點(diǎn)贊哦,如果非要打賞,我也是不會拒絕的啦!

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

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

  • java筆記第一天 == 和 equals ==比較的比較的是兩個變量的值是否相等,對于引用型變量表示的是兩個變量...
    jmychou閱讀 1,658評論 0 3
  • 一.線性表 定義:零個或者多個元素的有限序列。也就是說它得滿足以下幾個條件:??①該序列的數(shù)據(jù)元素是有限的。??②...
    Geeks_Liu閱讀 2,772評論 1 12
  • Collection & Map Collection 子類有 List 和 Set List --> Array...
    任教主來也閱讀 3,320評論 1 9
  • 空落落的大房子里,十八歲的孔怡坐在客廳的沙發(fā)上,也不開燈,在黑暗里睜著明亮亮的眼睛。這時,門發(fā)出吱呀的一聲響,有個...
    渾水摸魚兒閱讀 593評論 0 0
  • 今天某人親自下廚,好期待啊 哎吆喂!超出意外??!終于可以吃現(xiàn)成的了
    邱果閱讀 309評論 0 0

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