ArrayList簡介

ArrayList簡介

ArrayList實現(xiàn)了List接口定罢,內(nèi)部以數(shù)組存儲數(shù)據(jù)吼鱼,允許重復的值韩脑。由于內(nèi)部是數(shù)組實現(xiàn)劫谅,所以ArrayList具有數(shù)組所有的特性,通過索引支持隨機訪問嚷掠,查詢速度快捏检,但是插入和刪除的效率比較低。

ArrayList默認初始容量為10不皆,每次添加新元素時都會檢查是否需要擴容操作贯城。擴容操作需要重新拷貝數(shù)組,比較耗時霹娄,所以如果預先能知道數(shù)組的大小能犯,在初始化時候可以指定一個初始容量。

ArrayList不是線程安全的犬耻,使用時應注意踩晶。

源碼分析

jdk1.7.0_71

//默認容量
private static final int DEFAULT_CAPACITY = 10;
//默認空的數(shù)組,定義空的ArrayList
private static final Object[] EMPTY_ELEMENTDATA = {};
//保存ArrayList中元素的數(shù)組,以下基本操作都是基于該數(shù)組
private transient Object[] elementData;
//ArrayList中元素數(shù)組的容量
private int size;

無參構(gòu)造函數(shù)

    //構(gòu)造一個空的Object數(shù)組枕磁,初始容量為10
    public ArrayList() {}

指定容量大小的構(gòu)造函數(shù)

//指定初始容量
public ArrayList(int initialCapacity) {}

指定初始值為繼承Collection接口的集合的構(gòu)造函數(shù)

public ArrayList(Collection<? extends E> c) {}

trimToSize

//ArrayList每次增長會預申請1.5倍+1的空間,
//舉個例子就是當size() = 1000的時候渡蜻,ArrayList已經(jīng)申請了1200空間
//trimToSize 的作用是刪除多余的200
public void trimToSize() {
        modCount++;
        ...
    }

關(guān)于modCount

modCount定義在抽象類AbstratList中, 源碼的注釋基本說明了它的用處:在使用迭代器遍歷的時候,用來檢查列表中的元素是否發(fā)生結(jié)構(gòu)性變化(列表元素數(shù)量發(fā)生改變的一個計數(shù))了茸苇,主要在多線程環(huán)境下需要使用排苍,防止一個線程正在迭代遍歷,另一個線程修改了這個列表的結(jié)構(gòu)学密。

ensureCapacity

//增加此ArrayList實例的容量淘衙,如果需要,以確保其能容納至少由最小容量參數(shù)指定的元素數(shù)
public void ensureCapacity(int minCapacity) {}

grow()方法,實際的擴容方法,擴充為原來的1.5倍

//數(shù)組最大值
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        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);
}

size() ArrayList的大小

public int size() {}

isEmpty() 不包含元素,返回true

public boolean isEmpty() {}

contains()包含指定的元素,返回true

public boolean contains(Object o) {}

indexOf()

public int indexOf(Object o) {}

lastIndexOf()

public int lastIndexOf(Object o) {}

clone() 淺拷貝

public Object clone() {}

toArray() 返回Object數(shù)組

public Object[] toArray() {}

toArray(T[] a)

//返回數(shù)組的運行時類型是指定數(shù)組的腻暮。如果列表中指定的數(shù)組能容納彤守,則在其中返回。
//否則西壮,一個新的數(shù)組分配具有指定數(shù)組的運行時類型和此列表的大小遗增。
//如果列表中指定的數(shù)組能容納更加節(jié)省空間(即數(shù)組的元素比列表元素多),
//那么會將緊挨著collection尾部的元素設(shè)置為null款青。

public <T> T[] toArray(T[] a) {}

elementData() 根據(jù)索引返回數(shù)據(jù)

E elementData(int index) {}

get(int index) 根據(jù)索引獲取

public E get(int index) {
        rangeCheck(index);//范圍檢查,看是否給定的index是否超出數(shù)組大小
        ...
    }

set(int index, E element) 根據(jù)索引替換

public E set(int index, E element) {
        rangeCheck(index);
        ...
    }

add(E e) 添加元素到元素末尾

public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        ...
    }

add(int index,E element) 添加元素到指定位置

public void add(int index, E element) {
        rangeCheckForAdd(index);
        ...
    }

remove(int index)刪除指定位置的元素

public E remove(int index) {
        ...
        elementData[--size] = null; // clear to let GC do its work
        ...
}

remove(Object o) 刪除指定元素

public boolean remove(Object o) {
        ...
        fastRemove(index);
        ...
    }

fastRemove(int index)快速刪除,不檢查邊界,無返回值

private void fastRemove(int index) {}

clear() 清空

public void clear() {
        modCount++;

        // clear to let GC do its work
        for (int i = 0; i < size; i++)
            elementData[i] = null;

        size = 0;
    }

addAll(Collection<? extends E> c) 添加指定的集合到末尾

public boolean addAll(Collection<? extends E> c) {}

addAll(int index, Collection<? extends E> c) 添加指定元素到指定的位置

public boolean addAll(int index, Collection<? extends E> c) {}

removeRange(int fromIndex, int toIndex) 刪除指定區(qū)間的元素

protected void removeRange(int fromIndex, int toIndex) {}

removeAll(Collection<?> c) 刪除指定的集合元素

public boolean removeAll(Collection<?> c) {
        return batchRemove(c, false);
    }

retainAll(Collection<?> c) 保留指定集合元素

public boolean retainAll(Collection<?> c) {
        return batchRemove(c, true);
    }

listIterator(int index)和 listIterator() 返回一個迭代器,支持向前和向后遍歷

public ListIterator<E> listIterator(int index) {}

public ListIterator<E> listIterator() {}

iterator() 只能向后遍歷

public Iterator<E> iterator() {}

subList() 返回部分list

public List<E> subList(int fromIndex, int toIndex) {}

http://blog.csdn.net/crave_shy/article/details/17436773

http://www.importnew.com/19233.html

https://www.zybuluo.com/pastqing/note/200073

http://www.cnblogs.com/sipher/articles/2429812.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末做修,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子抡草,更是在濱河造成了極大的恐慌饰及,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件康震,死亡現(xiàn)場離奇詭異燎含,居然都是意外死亡,警方通過查閱死者的電腦和手機腿短,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門屏箍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人橘忱,你說我怎么就攤上這事赴魁。” “怎么了钝诚?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵颖御,是天一觀的道長。 經(jīng)常有香客問我凝颇,道長潘拱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任拧略,我火速辦了婚禮芦岂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘辑鲤。我一直安慰自己盔腔,他們只是感情好,可當我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著弛随,像睡著了一般瓢喉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上舀透,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天栓票,我揣著相機與錄音,去河邊找鬼愕够。 笑死走贪,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的惑芭。 我是一名探鬼主播坠狡,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼遂跟!你這毒婦竟也來了逃沿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤幻锁,失蹤者是張志新(化名)和其女友劉穎凯亮,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哄尔,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡假消,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了岭接。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片富拗。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖鸣戴,靈堂內(nèi)的尸體忽然破棺而出媒峡,到底是詐尸還是另有隱情,我是刑警寧澤葵擎,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站半哟,受9級特大地震影響酬滤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜寓涨,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一盯串、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧戒良,春花似錦体捏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽河泳。三九已至,卻和暖如春年栓,著一層夾襖步出監(jiān)牢的瞬間拆挥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工某抓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留纸兔,地道東北人。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓否副,卻偏偏與公主長得像汉矿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子备禀,可洞房花燭夜當晚...
    茶點故事閱讀 44,647評論 2 354

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