ArrayList初始容量探究

我們在使用ArrayList的時候,了解到默認(rèn)初始化容量是10慎菲,在Java 1.8的情況下,我們看下真實(shí)情況如何锨并。我們先看一個Demo代碼露该,執(zhí)行步驟如下:

  1. 初始化一個列表,查看容量
  2. 向列表添加一個元素第煮,查看容量
  3. 向列表添加十個元素解幼,查看容量
List<String> arrayList = new ArrayList<>();
Class<? extends List> arrayClass = arrayList.getClass();
Field field = arrayClass.getDeclaredField("elementData");
field.setAccessible(true);
Object[] elementData = (Object[]) field.get(arrayList);
System.out.println(String.format("現(xiàn)在長度是:%d,現(xiàn)在容量是:%d", arrayList.size(), elementData.length));

arrayList.add("aa");
elementData = (Object[]) field.get(arrayList);
System.out.println(String.format("現(xiàn)在長度是:%d包警,現(xiàn)在容量是:%d", arrayList.size(), elementData.length));

for (int i = 0; i < 10; i++) {
    arrayList.add("bb" + i);
}
elementData = (Object[]) field.get(arrayList);
System.out.println(String.format("現(xiàn)在長度是:%d书幕,現(xiàn)在容量是:%d", arrayList.size(), elementData.length));
System.out.println(arrayList);

我們來看結(jié)果:

現(xiàn)在長度是:0,現(xiàn)在容量是:0
現(xiàn)在長度是:1揽趾,現(xiàn)在容量是:10
現(xiàn)在長度是:11,現(xiàn)在容量是:15
[aa, bb0, bb1, bb2, bb3, bb4, bb5, bb6, bb7, bb8, bb9]

源代碼探究

private static final int DEFAULT_CAPACITY = 10; //初始化容量默認(rèn)值
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; //默認(rèn)空集合

// 默認(rèn)構(gòu)造函數(shù)苛骨,初始化為默認(rèn)集合
public ArrayList() {
    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

// 添加方法里面篱瞎,會調(diào)用容量檢查,里面會自動初始化容量
public boolean add(E e) {
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    elementData[size++] = e;
    return true;
}

private void ensureCapacityInternal(int minCapacity) {
    ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}

private static int calculateCapacity(Object[] elementData, int minCapacity) {
    // 如果是一個空列表痒芝,構(gòu)造默認(rèn)容量
    if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
        return Math.max(DEFAULT_CAPACITY, minCapacity);
    }
    return minCapacity;
}
    

我們發(fā)現(xiàn)俐筋,列表默認(rèn)構(gòu)造的時候,采用的是空集合严衬,而調(diào)用add方法的時候澄者,會確認(rèn)容量是否夠用,如果不夠使用,會進(jìn)行擴(kuò)容粱挡,擴(kuò)容的時候赠幕,會進(jìn)行初始化操作,這樣做的好處是询筏,避免初始化的時候榕堰,就浪費(fèi)空間。

我們再來看看擴(kuò)容的源代碼

private void grow(int minCapacity) {
    // overflow-conscious code
    int oldCapacity = elementData.length;
    // 新容量采用現(xiàn)有容量+現(xiàn)有容量一半(向右位移1位嫌套,相當(dāng)于除2)
    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);
}
  1. 新擴(kuò)容的容量采用現(xiàn)有容量+現(xiàn)有容量一半(向右位移1位逆屡,相當(dāng)于除2)
  2. 擴(kuò)容后,對列表進(jìn)行拷貝踱讨,重新建立一個新的列表

結(jié)論

  1. Java 1.8下魏蔗,列表默認(rèn)初始化的時候,并不會初始化默認(rèn)容量10痹筛,避免初始化浪費(fèi)空間
  2. 列表不夠用了莺治,按1.5倍進(jìn)行擴(kuò)容,但擴(kuò)容有性能損耗味混,如果能提前估算容量产雹,最好提前設(shè)置
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市翁锡,隨后出現(xiàn)的幾起案子蔓挖,更是在濱河造成了極大的恐慌,老刑警劉巖馆衔,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瘟判,死亡現(xiàn)場離奇詭異,居然都是意外死亡角溃,警方通過查閱死者的電腦和手機(jī)拷获,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來减细,“玉大人匆瓜,你說我怎么就攤上這事∥打颍” “怎么了驮吱?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長萧吠。 經(jīng)常有香客問我左冬,道長,這世上最難降的妖魔是什么纸型? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任拇砰,我火速辦了婚禮梅忌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘除破。我一直安慰自己牧氮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布皂岔。 她就那樣靜靜地躺著蹋笼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪躁垛。 梳的紋絲不亂的頭發(fā)上剖毯,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天,我揣著相機(jī)與錄音教馆,去河邊找鬼逊谋。 笑死,一個胖子當(dāng)著我的面吹牛土铺,可吹牛的內(nèi)容都是我干的胶滋。 我是一名探鬼主播,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼悲敷,長吁一口氣:“原來是場噩夢啊……” “哼究恤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起后德,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤部宿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后瓢湃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體理张,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年绵患,在試婚紗的時候發(fā)現(xiàn)自己被綠了雾叭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡落蝙,死狀恐怖织狐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情筏勒,我是刑警寧澤赚瘦,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站奏寨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鹰服。R本人自食惡果不足惜病瞳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一揽咕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧套菜,春花似錦亲善、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至戏溺,卻和暖如春渣蜗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背旷祸。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工耕拷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人托享。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓骚烧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親闰围。 傳聞我的和親對象是個殘疾皇子赃绊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評論 2 349

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