Java Collections Framework - ArrayList

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

定義

ArrayList底層以數組實現咙鞍,允許重復房官,默認第一次插入元素時創(chuàng)建數組的大小為10,超出限制時會增加50%的容量续滋,每次擴容都底層采用System.arrayCopy()復制到新的數組翰守,初始化時最好能給出數組大小的預估值。

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;
    //其余省略
}

概述

按數組下標訪問元素—get(i)/set(i,e) 的性能很高疲酌,這是數組的基本優(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;
}

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

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

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

考慮這樣一種情形臀脏,當某個應用需要劝堪,一個ArrayList擴容到比如size=10000,之后經過一系列remove操作size=15揉稚,在后面的很長一段時間內這個ArrayList的size一直保持在<100以內秒啦,那么就造成了很大的空間浪費,這時候建議顯式調用一下trimToSize()這個方法搀玖,以優(yōu)化一下內存空間余境。 ??
或者在一個ArrayList中的容量已經固定,但是由于之前每次擴容都擴充50%灌诅,所以有一定的空間浪費芳来,可以調用trimToSize()消除這些空間上的浪費。

RandomAccess

這個接口有什么用猜拾?
實現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();
}

說明實現了RandomAccess接口的集合,在數據量很大的情況下挎袜,采用迭代器遍歷比較慢顽聂。


和LinkedList的區(qū)別

1、ArrayList是實現了基于動態(tài)數組的數據結構盯仪,LinkedList基于鏈表的數據結構紊搪。
2、對于隨機訪問get和set全景,ArrayList覺得優(yōu)于LinkedList嗦明,因為LinkedList要移動指針。
3蚪燕、對于新增和刪除操作add和remove(不是在尾部添加刪除)娶牌,LinkedList比較占優(yōu)勢,因為ArrayList要移動數據馆纳。


和Vector的區(qū)別

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

END狈惫。
我是占小狼。
在魔都艱苦奮斗鹦马,白天是上班族胧谈,晚上是知識服務工作者。
讀完我的文章有收獲荸频,記得關注和點贊哦菱肖,如果非要打賞,我也是不會拒絕的啦旭从!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末稳强,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子和悦,更是在濱河造成了極大的恐慌退疫,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件摹闽,死亡現場離奇詭異蹄咖,居然都是意外死亡,警方通過查閱死者的電腦和手機付鹿,發(fā)現死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門澜汤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人舵匾,你說我怎么就攤上這事俊抵。” “怎么了坐梯?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵徽诲,是天一觀的道長。 經常有香客問我吵血,道長谎替,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任蹋辅,我火速辦了婚禮钱贯,結果婚禮上,老公的妹妹穿的比我還像新娘侦另。我一直安慰自己秩命,他們只是感情好尉共,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著弃锐,像睡著了一般袄友。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上霹菊,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天剧蚣,我揣著相機與錄音,去河邊找鬼浇辜。 笑死券敌,一個胖子當著我的面吹牛唾戚,可吹牛的內容都是我干的柳洋。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼叹坦,長吁一口氣:“原來是場噩夢啊……” “哼熊镣!你這毒婦竟也來了?” 一聲冷哼從身側響起募书,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤绪囱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后莹捡,有當地人在樹林里發(fā)現了一具尸體鬼吵,經...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年篮赢,在試婚紗的時候發(fā)現自己被綠了齿椅。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡启泣,死狀恐怖涣脚,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情寥茫,我是刑警寧澤遣蚀,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站纱耻,受9級特大地震影響芭梯,放射性物質發(fā)生泄漏。R本人自食惡果不足惜弄喘,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一玖喘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧限次,春花似錦芒涡、人聲如沸柴灯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赠群。三九已至,卻和暖如春旱幼,著一層夾襖步出監(jiān)牢的瞬間查描,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工柏卤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留冬三,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓缘缚,卻偏偏與公主長得像勾笆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子桥滨,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內容

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