可能大家都知道,java中的ArrayList類,是一個(gè)泛型集合類,可以存儲指定類型的數(shù)據(jù)集合,也知道可以使用get(index)方法通過索引來獲取數(shù)據(jù),或者使用for each 遍歷輸出集合中的內(nèi)容,但是大家可能對其中的具體的方法是怎么實(shí)現(xiàn)的不大了解,本篇就將從jdk源碼的角度看看什么是動態(tài)擴(kuò)容數(shù)組(畢竟我們不應(yīng)該停留在會用的層面上)。本篇主要從以下幾個(gè)角度看看ArrayList:

  • add及其重載方法是如何實(shí)現(xiàn)的

  • remove及其重載方法是如何實(shí)現(xiàn)的

  • 迭代器的本質(zhì)及實(shí)現(xiàn)的基本原理


    一、add方法添加元素到集合中
         實(shí)際上ArrayList內(nèi)部是用的 transient Object[] elementData;這么一條語句定義的一個(gè)Object類型的數(shù)組,因?yàn)槲覀冎罃?shù)組一旦被初始化長度就不能再發(fā)生改變,那我們的ArrayList是怎么做到可以不斷的添加元素到集合中的呢?其實(shí)就是通過創(chuàng)建新的數(shù)組,將原來的數(shù)組中的內(nèi)容轉(zhuǎn)移到新的數(shù)組中來,實(shí)現(xiàn)動態(tài)擴(kuò)容。具體的我們看源碼:

public static void main(String[] args){
        ArrayList<Integer> list = new ArrayList<Integer>();        list.add(1);
    }/*這是最簡單的add方法*/public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;        return true;
    }


          當(dāng)調(diào)用此add方法時(shí),將指定了類型的數(shù)據(jù)傳入(變量e接受),首先執(zhí)行第一條語句:ensureCapacityInternal(size + 1);,這條語句實(shí)際上就是用來判斷size+1之后是否會導(dǎo)致原數(shù)組長度溢出,如果會就擴(kuò)充數(shù)組容量,如果沒有就什么也不做。我們看看ensureCapacityInt