ArrayList擴容機制

一、ArrayList構(gòu)造函數(shù)

ArrayList的構(gòu)造函數(shù)有三種

private static final long serialVersionUID = 8683452581122892189L;

    private static final int DEFAULT_CAPACITY = 10;

    private static final Object[] EMPTY_ELEMENTDATA = {};

    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

    transient Object[] elementData; // non-private to simplify nested class access

     private int size;

  /**
     * Constructs an empty list with the specified initial capacity.
     *
     * @param  initialCapacity  the initial capacity of the list
     * @throws IllegalArgumentException if the specified initial capacity
     *         is negative
     */
     public ArrayList(int initialCapacity) {
         if (initialCapacity > 0) {//固定值大于0
             this.elementData = new Object[initialCapacity];//創(chuàng)建固定空間的數(shù)組
         } else if (initialCapacity == 0) {
              this.elementData = EMPTY_ELEMENTDATA;//創(chuàng)建一個空數(shù)組
         } else {
             throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);//
         }
     }

  /**
     * Constructs an empty list with an initial capacity of ten.
     */
    public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }

  /**
     * 構(gòu)造一個包含指定元素的列表集合茫舶,按集合的返回順序迭代器械巡。
     *
     * @param c the collection whose elements are to be placed into this list
     * @throws NullPointerException if the specified collection is null
     */
    public ArrayList(Collection<? extends E> c) {
        elementData = c.toArray();
        if ((size = elementData.length) != 0) {
            // c.toArray might (incorrectly) not return Object[] (see 6260652)
            if (elementData.getClass() != Object[].class)
                elementData = Arrays.copyOf(elementData, size, Object[].class);
        } else {
            // replace with empty array.
            this.elementData = EMPTY_ELEMENTDATA;
        }
    }

二、查看add函數(shù)饶氏,探索擴容原理

以無參構(gòu)造器為例

  /**
     * Appends the specified element to the end of this list.
     * 將指定的元素追加到此列表的末尾
     * @param e element to be appended to this list
     * @return <tt>true</tt> (as specified by {@link Collection#add})
     */
    public boolean add(E e) {
        //檢查容量讥耗,調(diào)用ensureCapacityInternal方法
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }
private static int calculateCapacity(Object[] elementData, int minCapacity) {
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            return Math.max(DEFAULT_CAPACITY, minCapacity);
        }
        return minCapacity;
    }
當(dāng) 要 add 進第1個元素時,minCapacity為1疹启,在Math.max()方法比較后古程,minCapacity 為10。
private void ensureCapacityInternal(int minCapacity) {
        ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
    }

    private void ensureExplicitCapacity(int minCapacity) {
        modCount++;

        // overflow-conscious code 
        if (minCapacity - elementData.length > 0)
           //調(diào)用grow函數(shù)擴容
            grow(minCapacity);
    }

三喊崖、grow函數(shù)擴容

  /**
     * Increases the capacity to ensure that it can hold at least the
     * number of elements specified by the minimum capacity argument.
     *
     * @param minCapacity the desired minimum capacity
     */
    private void grow(int minCapacity) {
        // oldCapacity為舊容量挣磨,newCapacity為新容量
        int oldCapacity = elementData.length;
        //將oldCapacity 右移一位,其效果相當(dāng)于oldCapacity /2
        //新容量的大小為舊容量的1.5倍
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        //然后檢查新容量是否大于最小需要容量荤懂,若還是小于最小需要容量茁裙,那么就把最小需要容量當(dāng)作數(shù)組的新容量,
        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:
        //復(fù)制數(shù)組中的元素
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

  private static int hugeCapacity(int minCapacity) {
          if (minCapacity < 0) // overflow
              throw new OutOfMemoryError();
          return (minCapacity > MAX_ARRAY_SIZE) ?
              Integer.MAX_VALUE :
             MAX_ARRAY_SIZE;
     }
最后編輯于
?著作權(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)容