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

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

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

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


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

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;
    }


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

網(wǎng)友評論